导图社区 python面向对象--魔术方法
python面向对象--魔术方法,各种魔术方法的运用整合到一起放在附件中,一起来看
编辑于2023-03-30 14:08:32 江西Python类和对象
面向对象
类
描述事物的一个模板,封装了事物的特征和行为
描述符类
作用:对实例对象的某个属性管理操作全权交给描述符类来实现
定义过程:
1.在类之前创建描述符类
2.定义描述符的三个方法:__set__,__get__,__delete__
3.把相应的类属性或者实例属性交接给描述符管理(属性=描述符())
4.描述符内定义一个初始属性映射要被管理的属性
5.实例属性调用属性时候,此时通过描述符类的__get__(self,obj,cls)方法return返回映射的属性
6.
对象
实例对象
类的实例,属于模板对应的实际事物
功能:
访问实例属性
修改实例属性
删除实例属性
添加实例属性
动态添加新的实例方法
动态修改原有的实例方法
匿名对象
只使用一次后就变成垃圾等待释放
没有名称引用,类名直接调用
属性
类属性
所有实例对象共有的特征
修改方法:
添加
类名添加
修改
类名修改
调用方法:
类名调用
实例对象调用(不推荐)
1.当类属性和实例属性同名时候 ,使用实例对象调用类属性时,优先调用的是实例属性 2.当实例对象尝试修改类属性值时,实际是定义新的实例属性
实例属性
不同实例对象其特征可能存在不同
调用方法:
实例对象调用
1.__init__内已经初始化的属性,对象创建后可以自动调用
2.实例方法内的属性,必须对象调用方法后,才能包含此属性
3.某个实例对象修改或添加实例属性,不会影响其他实例对象
__slots__:限制实例对象属性的设置范围
方法
实例方法
实例对象所拥有的行为或功能
绑定方式调用
使用实例对象进行self绑定调用
非绑定方式调用
强行使用字符串绑定self,会导致崩溃
匿名对象调用
类名().方法()
类方法
@classmethod
使用类名或者实例对象来调用
静态方法
@staticmethod
使用类名或者实例对象来调用
魔术方法
对象相关
__new__(构造器)
触发时机:当类准备创建实例对象时调用
作用:创建一个实例对象
参数:cls代表需要创建的对象对应的实例(特殊情况可以是其他类)
返回值:必须有返回值,实例对象是什么取决于返回的是什么(可以重写父类)
注意事项:重写__new__方法只是实现控制对象是否创建,生成对象仍然需要调用基类的new方法,objcect.__new__(cls)来生成对象,如果没有重写,默认也是调用父类或者追溯object类自动创建对象
__init__(构造方法)
触发时机:创建实例对象时,自动触发
作用:为对象初始化属性
参数:self代表对象本身,其余参数根据传参决定
__del__(析构方法)
触发时机:对象在系统回收,dell关键字时自动触发
返回值:无
__call__
触发机制: 把对象当作函数直接调用时自动触发
作用: 1.简化了对象方法的调用 (当某方法调用频率很高) 2.模糊了对象和函数调用时的区别 (提高了代码的兼容性)
参数:1.self2.根据需求可有可无
注意事项:函数能作为对象,函数名()调用,说明创建的时候定义了__call__方法,同理,类也可以用其对象当做函数来调用,对象名()
__str__
触发:打印对象时自动触发,str()函数转换也会触发,有__repr__没有__str__,调取__repr__
作用:改变对象输出的内容,不再固定输出类型和内存地址
返回值:必须返回字符串信息
__repr__
触发时机:使用repr()转换对象时触发,否则只是触发__str__
作用:有别__str__,输出的是带引号的正式字符串
返回值:必须是字符串
注意事项:__str__ = __repr__ ,当不存在__str__时调用__repr__,repr(正式字符串格式),如何理解官方所谓的正式和非正式,能否被eval函数调用的为正式,字符串print时会去除引号,但repr会显示的print字符串引号标记
__len__
触发机制: 当使用len函数去检测当前对象的时候自动触发
作用: 可以使用len函数检测当前对象中某个属性的个数
返回值: 必须返回一个整数
__bool__
触发时机:使用bool()转换对象时触发
作用:丰富检测对象属性时的返回信息
返回值:必须有且必须是布尔值
注意事项:如果没定义__bool__,系统会自动调用__len__的返回值再进行判断T或F
__format__
触发时机:实例对象使用format()格式化时候触发
作用:自定义对象格式化时返回的信息
参数:self,和format_spec(用来接收格式化描述符的字符串)
返回值:返回自定义格式的对象信息
注意事项: format_spec传参方式: 1."XXXXX{0:specification}XXX".format(someobject)-->此方式只把speciffcation作为描述符传入形参 2.format(someobject, specification)
属性相关
__getatrribute__
属性访问最高的优先级
触发时机:访问对象属性的时(类名.属性不会触发),无论属性是否存在都会触发
作用:用户访问实例对象属性时进行拦截,自定义返回相关信息
参数:1.self接收当前对象,2.item访问对象属性名称的字符串
返回值:有,不设置则返回None(属性不存在不会有返回值)
注意事项:不能直接以对象.属性(self.属性)来返回,否则会递归循环,可重载父类的方式object.__getatrribute__(self,item)进行避免递归
__getatrr__
触发时机:对象属性不存在的时候触发
作用:当用户访问不存在属性时候,自定义返回相关信息
参数:1.self接收当前对象,2.item访问对象属性名称的字符串
return: 有,不设置为None
注意事项: 属性访问的顺序: __ getattribute__-->数据描述符-->对象属性-->类属性-->非数据描述符-->__getattri__
__setattr__
触发时机:对象创建属性和修改属性时触发
作用:
注意事项:避免递归,1.重载父类,在父类中更新子类的值object.__setattr__(self,key,value) 2.手动在__dict__中注册(添加)属性值 self.__dict__[key] = value
__ delattr__
触发时机:del清除实例属性时候被触发
参数:1.self 接收当前对象 2.item 被del 删除的属性名称字符串
注意事项: 要真正删除对象属性,必须调用父类__delattr__方法才能有效删除属性
__dict__作用:字典形式显示实例对象或者类的属性,key=属性名,value=属性值