python面向对象---创建类
面向对象Object Oriented\
*概述*
*面向过程*
- 分析出解决问题的步骤,然后逐步实现。
例如:婚礼筹办
– 发请柬(选照片、措词、制作)
– 宴席(场地、找厨师、准备桌椅餐具、计划菜品、购买食材)
– 婚礼仪式(定婚礼仪式流程、请主持人)
公式:程序 = 算法 + 数据结构
优点:所有环节、细节自己掌控。
缺点:考虑所有细节,工作量大。
*面向对象*
- 找出解决问题的人,然后分配职责。
例如:婚礼筹办
– 发请柬:找摄影公司(拍照片、制作请柬)
– 宴席:找酒店(告诉对方标准、数量、挑选菜品)
– 婚礼仪式:找婚庆公司(对方提供司仪、制定流程、提供设备、帮助执行)
公式:程序 = 对象 + 交互
优点
(1) 思想层面:
– 可模拟现实情景,更接近于人类思维。
– 有利于梳理归纳、分析解决问题。
(2) 技术层面:
– 高复用:对重复的代码进行封装,提高开发效率。
– 高扩展:增加新的功能,不修改以前的代码。
– 高维护:代码可读性好,逻辑清晰,结构规整。
*类和对象*
类:一个抽象的概念,即生活中的”类别”。
对象:类的具体实例,即归属于某个类别的”个体”。
类是创建对象的”模板”。
– 数据成员:名词类型的状态。
– 方法成员:动词类型的行为。
- 类与类行为不同,对象与对象数据不同。
*语法*
*定义类*
- 代码
class 类名:
“””文档说明”””
``def init(self,参数列表):`
self.实例变量 = 参数
方法成员
- 说明
– 类名所有单词首字母大写.
– _init_
也叫构造函数,创建对象时被调用,也可以省略。
– self 变量绑定的是被创建的对象,名称可以随意。
#创建类
class 类名:#类名首字母大写def __init__(self,参数)#数据成员self.数据1=参数#行为成员def 方法名称():方法体#创建对象
变量名=类名(参数)
实例变量
实例变量:实例化对象时,每个对象都会有自己的实例变量,各实例变量之间不影响
- 在构造函数中定义
- 实例变量由实例对象修改,类修改实例变量没意义
- 每个实例对象有一份实例变量
- 实例变量也可以在创建对象后,用对象名.变量名创建或修改实例变量,但不建议这样做
实例方法
在类中定义的函数
def 方法名(self,参数列表)
类成员
类变量
1.语法:
——定义:在类中,方法外定义的变量
——调用:类名.变量名 不建议通过对象访问类变量
2.说明
——存储在类中,方法区
——只有一份,类变量会被所有对象所共享
3.作用:描述所有对象的共有数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rbksoub-1630498312070)(C:\Users\13664\AppData\Roaming\Typora\typora-user-images\image-20210829211735894.png)]
类方法
1.语法
——1)定义:
@classmethod
def 方法名称(cls,参数列表)
方法体
——2)调用:类名.方法名(参数列表) 不建议通过对象访问类方法
2.说明:
——至少有一个形参,第一个形参用于绑定类,一般命名为‘cls’
——使用@classmethod修饰的目的是调用类方法时可以(自动)隐式传递类
——类方法中没有对象地址,因此类方法中不能访问类成员,但实例方法中可以访问类成员
3.作用:操作类变量
实例
class ICBC:"""工商银行"""total_money=100000#创建类方法@classmethoddef add_money(cls):cls.total_money+=100000@classmethoddef print_total_money(cls):print(f"总行还剩{ICBC.total_money}元")print(f"总行还剩{cls.total_money}元")def __init__(self,name,money):self.name=nameself.money=money#表示从总行中扣除当前支行使用的金额ICBC.total_money-=money#创建实例对象
i01=ICBC("a支行",10000)
i02=ICBC("b支行",20000)
print(f"总行还剩{ICBC.total_money}元")#总行还剩70000元
#调用类方法
ICBC.add_money()
ICBC.print_total_money()
#总行还剩170000元
#总行还剩170000元
静态方法
将函数移到方法中就是静态方法
- 语法
(1) 定义:
@staticmethod
def 方法名称(参数列表):
方法体
(2) 调用:类名.方法名(参数列表)
不建议通过对象访问静态方法
- 说明
– 使用@ staticmethod修饰的目的是该方法不需要隐式传参数。
– 静态方法不能访问实例成员和类成员
- 作用:定义常用的工具函数。
class Vetor2:"""二维向量"""def __init__(self,x,y):self.x=xself.y=y#将函数移到方法中就是静态方法@staticmethoddef left():return Vetor2(0,-1)@staticmethoddef right():return Vetor2(0,1)p0=Vetor2(1,2)#c创建一个坐标为1,2的二维向量
l01=Vetor2.left()#向左移动一个单位
#进行移动
p0.x+=l01.x
p0.y+=l01.y
print(p0.x,p0.y)#1 1class Double_list_helper:@staticmethoddef get_elements(target,vect_pos,vect_dir,count):"""在二维列表中获取指定位置,指定方向,指定数量的元素:param target: 二维列表:param vect_pos: 指定位置:param vect_dir: 指定方向:param count: 数量:return: 列表"""list_result=[]for i in range(count):vect_pos.x+=vect_dir.xvect_pos.y+=vect_dir.yelemnts=target[vect_pos.x][vect_pos.y]list_result.append(elemnts)return list_resultre=Double_list_helper.get_elements(list01,Vetor2(1,0),Vetor2.right(),3)print(re)#['11', '12', '13']
总结
成员:
实例:对象的数据(变量),对象的行为(方法)
类:类的数据(变量),类的行为(方法)
方法:
实例方法操作实例变量,表示“个体“行为
类方法操作类变量,表示“大家”行为
静态方法不能操作实例变量,或者类方法,但开发过程中以面向对象为基础,所以需要 把面向过程的函数变成静态方法写在类中
例子
"""
定义敌人类
数据:姓名,血量,基础攻击力,防御力
行为:打印个人信息
找到名字为乐芙兰的对象
找到血量为0的对象
计算所有敌人的平均攻击力
删除防御力小于30的敌人
"""
class Enemy:def __init__(self, name, HP, base_damage, defense):self.name=nameself.HP=HPself.base_damage=base_damageself.defense=defensedef print_info(self):#行为:打印个人信息print(f"姓名:{self.name} 血量:{self.HP} "f"基础攻击力:{self.base_damage} 防御力:{self.defense}")@staticmethoddef find_enemy(list_e):#找到名字为乐芙兰的对象for item in list_e:if item.name == "乐芙兰":return item@staticmethoddef find_death(list_e):#找到血量为0的对象list_d=[]for item in list_e:if item.HP==0:list_d.append(item.name)return list_d@classmethod#计算所有敌人的平均攻击力def average_damage(cls,list_e):sum=0for item in list_e:sum+=item.base_damagereturn sum//len(list_e)@classmethod#删除防御力小于30的敌人def delete(cls,list_e):for i in range(len(list_e)-1,-1,-1):"""倒序删除,因为如果删除对象大于一个,正序删除的话每删除一个会让列表索引向前减一,这样步长会变成2,加入两个要删除的对象在一起,这样只能删除一个而倒序没有这样的bug"""if list_e[i].defense<30:del list_e[i]e1=Enemy("墨菲特",660,65,47)
e2=Enemy("卡兹克",643,72,34)
e3=Enemy("乐芙兰",515,65,24)
e4=Enemy("厄斐琉斯",0,65,34)
e5=Enemy("锤石",549,61,30)
list_enemy=[e1,e2,e3,e4,e5]Enemy.find_enemy(list_enemy).print_info()
print(Enemy.find_death(list_enemy))
print(Enemy.average_damage(list_enemy))Enemy.delete(list_enemy)#打印处理后的所有敌人
for item in list_enemy:item.print_info()
python面向对象---创建类相关推荐
- Python 入门 —— Python 面向对象:类的创建及其基本内置方法的使用
Python 面向对象:类的创建及其基本内置方法的使用 首先了解一下什么是面向对象 面向过程: 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. ...
- Lua 面向对象 创建类实例
Lua 面向对象 创建类实例 面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构 常用的面向对象编程语言:C++.Java.Object-C. ...
- Python面向对象编程——类的学习
面向对象编程 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向 ...
- 4. Python面向对象语法——类的构造函数
目录 1. 类的构造函数介绍 2. __init__()的使用说明 3. 代码实例 1. 类的构造函数介绍 类的构造函数用于从类创建实例对象的过程: 类的构造函数为实例对象创建提供了参数输入方 ...
- python 面向对象和类
python 面向对象 面向对象的概念 类和对象 类的构成 类的定义 实列属性 实例方法 魔法方法__init__() 模法方法__str__() 公有和私有 类的继承 面向对象的概念 对于面向过程的 ...
- 【轻松学】Python面向对象编程——类的设计、基础语法、继承、多态、类属性和类方法、单例设计
文章目录 1. 类的设计 大驼峰命名法 1.1 类名的确定 1.2 属性和方法的确定 练习 1.1 练习 1.2 2. 面相对象基础语法 2.1 定义简单的类(只包含方法) 2.1.1 定义只包含方法 ...
- PYTHON面向对象(类)
一.PYTHON面向对象基础 面向对象侧重于对的人,做对的事 1.类和对象的基本概念 类的介绍 对象的介绍 类和对象的关系 2.类的设计基础 类设计的三要素 3.类使用的基本语法 3.1类的定义和使用 ...
- Python面向对象—对象|类
1.对象 说明 (1)英文"Object",表示任意存在的事物. (2)在Python中,一切皆对象,具体的事物.字符串.函数等都是对象,即python天生就是面向对象的. 2.类 ...
- python的面向对象中属性和方法默认是-Python 面向对象,类的属性和 类的方法...
面向对象,类的属性和 类的方法 面向对象 类和对象 Python类定义 类属性 类方法 面向过程和面向对象 面向过程 和 面向对象 编程 面向过程 编程:函数式编程,C程序,shell等 面向对象 编 ...
最新文章
- Java课程设计——坦克大战
- 配置apache服务器的文件名,apache服务器配置文件名是
- 内部体验腾讯负载均衡的新功能
- CSDN博客如何转载(技术贴)
- C#和Java在重写上的区别
- linux用户密码策略求图,Linux用户密码策略
- 前端学习(1847)vue之电商管理系统电商系统的功能划分
- python正则匹配表达式(2)
- 从C语言到C++的进阶之一些C基础上的增强用法(篇五)
- 1039. 到底买不买(20)-PAT乙级真题
- C++的静态联编和动态联编
- 论文赏析【EMNLP19】多粒度自注意力机制(MG-SA)
- C/C++ 取整函数ceil(),floor(),向上取整,向下取整
- python字符串的基本操作_python-字符串基本操作
- Multisim14基本介绍(上)
- 个个给力2010年十大国产软件新品回顾
- IE6 浏览器常见兼容问题 大汇总(23个)
- http解析库http-parser
- 淘宝后台添加颜色尺码动态sku
- 联想Z5 Pro划时代旗舰发布 屏占比95.06%售价1998元起