Python 类、对象
类
归属于同一类,统称为类。例如:人类、鸟类、哺乳动物类等
属于同一类的特性:具有某些相同的共性。具有相同特征或者相同行为的群体 例如:人基本都有:眼睛、鼻子、嘴巴、耳朵等等
对象
什么是对象?object 又被称为实例 instance
object:东西 事物
对象是类当中的成员、个体。例如:人类的对象,包含:男人、女人;男人类里又包含:爸爸、爷爷、老公、儿子等等
类和对象在python的体现
定义类的关键字:Class
类的定义:
class 类名:
类的组成部分
类的命名规则:大驼峰命名,即两个单词的首字母大写ExcelHandler、People
函数的命名:下划线命名,即两个单子之间是加下划线def shuxing_01()
变量的命名:下划线命名,即两个单子之间是加下划线shuxing、username
如下图:
类的调用:
类、函数结合使用:
1、类方式的调用
2、对象的表示方式(输出的:<__main__.pepole object at 0x7fc7581945d0> 为:people类方法中的对象object)
经典面试题:
a1、a2 两个变量均等于pepole类的对象 People()
但是实际输出的对象不同。所以,a1、a2 是不同的对象,且内存地址也不一样。
先有类,再生成一个一个对象,如下图:
类属性、实类属性的区别
属性:类和对象的特征
类属性:这个类的特征,这个群体的特征,所有的成员都一样。其他的类,可能不具备该特征。 例如:人类和鸟类的区别
实类属性:这个类中,这个个体的特征,类当中其他个体,可能不具备。 例如:人类中 男人、女人的区别
类属性的定义:可以先定义、可以后添加(类.新类属性=新类属性的值)
类属性的获取:类.属性
⚠️注意:
1、类属性可以被实类、对象访问
2、实类属性不可以被类获取
输出实类属性
print(geren.erduo)
其他个体,调用该实类属性 (报错的原因:某个个体的属性,其他个体不具备)
print(man.erduo)
类获取个体实类属性 (报错原因:实类属性不可以被类获取)
print(Pepole.erduo)
个体获取类的属性
print(woman)
print(children)
实类属性
初始化:要通过定义的类,得到一个具体的对象。对象的个体,初始化过程保证自己的与众不同(例如:张三、李四 -- 长相、性格、身高不同)
设置先天属性的方法:(self: 在类里面,表示一个对象它自己,只能代表它一个)
def _ _init_ _(self):
设置的实例属性方式:self.属性 = 参数
语法:
def _ _init_ _ (self,name):
self.name = name
⚠️注意:
1、在实例方法里面设置实例属性。就是对象的初始化过程,让每个对象的属性不太一样
2、_ _init_ _ (self) 里面的参数跟实际调用时传入的参数要一一对应。(位置参数一一对应)
3、_ _init_ _ 定义的形式参数 和 对象的实例化的实际参数,是一一对应的。
例如:
Woman类,初始化过程中,_ _init_ _ 定义的形式参数,在对象调用的时候,Woman类,必须传入实例参数
Woman(22,"落落大方","本科",height=165) 传入的顺序必须和实际的位置参数一一对应。
然后再调用类里面的方法。
_ _init_ _ (self) 总结:
♥必须return None(不写就是return None,写一个return,也会返回None。return 其他值会报错)
♥传入的参数必须设置为实例属性,才能被对象访问到(也就是 _ _init_ _ (self,name,age) 形式参数,必须要实例化,才可以被访问到,也就是需要定义 self.name = name )
self 在类里面, 表示一个 **对象** 他自己。
类属性和实例方法之间的运用:
总结:
1、属性
先天具备的属性,不管是类属性,实例属性,都是在类名下面,__init__直接定义好。
方法
1、类方法,本质上其实就是函数
类方法和函数区别:
类方法:有self标识、放在类方法中、缩紧;类方法的调用:类名或对象名 :对象.方法()
函数:单个的函数,不需要加self,可以直接定义。函数的调用:函数前面要么不加,要么加导入的模块名称
2、实例方法 (对象方法)
第一个参数名称规定是self
实例方法的调用:只能被实例/对象调用
实例方法在调用的时候,前缀是对象,不能是类
3、实例方法中定义个实例属性,调用的时候,不能直接调用这个属性,要先调用这个方法,在调用属性
结果输出(实例方法中定义个实例属性,调用的时候,不能直接调用这个属性,要先调用这个方法,在调用属性)
输出结果(实例方法在调用的时候,前缀是对象,不能是类)
类直接调用实例方法
对象调用实例方法
类与装饰器结合使用
类方法:@classmethod
在定义的类方法上面加上@classmethod ,@表示装饰器 decorator,将方法中的 self 改为 cls ;此时,类方法的调用:实例和类都可以调用。
结果输出:
cls 表示: 类 ,它自己,类方法可以 调用类属性(下面黄底代码)
cls:在 类 里面,表示一个 类 他自己。
静态方法
@staticmethod
静态方法,放在类里面的普通函数 不需要传固定的self
使用静态方法,为了方便管理代码(可以实现,类中含有类方法、其他函数)
类、对象都可以调用 静态方法(即调用静态方法,只需要在静态方法前面加类名或对象名)
设置只读属性
@property
防止这个属性被被人篡改,设置为只读属性,比较安全。
被property装饰的方法,调用的时候,不需要加()
综上所述,总结如下:
1.实际使用过程中,实例方法占大多数情况(98%),工作中不知道该定义为 什么方法时,直接定义为实例方法。
2.静态方法:可以用普通函数替代,不是必须的(方便管理)
实例方法具体方式:
输出结果:
类知识点总结
1.实例属性 和 类属性的区别
实例 可以获取 实例属性 和类属性
类 只能获取类属性
2.方法
实例方法 实例具备的,类不一定具备
类方法 类具备的,实例可以获取
静态方法 放在类里面的普通函数(对应函数上方,需要加装饰器@staticmethod)
3._ _init_ _
是对象的初始化过程。通常在里面定义实例属性
实例属性的值通过参数传递进来(参数必须要赋值时实例属性 self.属性 = 参数)
4.类固定使用关键字
self 类定义的里面 对象
cls 类里面 表示类 (对应实例方法上方,需要加装饰器@classmethod ,实例方法传关键字cls;此时,类和对象都可以对该方法进行调用)
5.(重点)如果一个属性名,既是类属性 ,又是实例属性,实例优先访问实例属性
6.如果在一个具体的场景中,不知道是用类属性还是实例属性(答案:就用实例属性)