制心一处,无事不办.

一.魔术方法

1.init初始化方法

init初始化方法
触发机制:当实例化对象之后就会立即触发的方法
作用:为当前创建的对象完成一些初始化的操作.比如:成员属性的赋值,方法的调用,打开或创建一些资源
参数:一个self,接受当前对象,其他参数根据需求进行定义即可
返回值:无
注意事项:无

2.del析构方法

del析构方法
触发机制:当该类的对象被销毁时,自动触发
作用:关闭和释放对象 创建时打开或创建的一些资源
参数:一个self接受当前的对象
返回值:无
注意事项:无

3.new构造方法

new构造方法
#触发机制:实例化对象时自动触发(在init之前触发)
作用:管理或控制对象创建的过程
参数:一个cls接收当前类,其他参数根据初始化方法的参数进行决定
返回值:必须返回object.new(cls)进行对象的创建,如果没有返回值,则实例化对象的结果为None
注意事项:new方法的参数和init方法的参数要保持一致,除了第一个参数
应用场景:设计模式中的单例模式

4.call

call
触发机制:把对象当作函数直接调用时自动触发
作用:一般用于归纳类或对象的操作步骤,方便调用
参数:一个self接收当前对象,其他参数根据需求决定
返回值:可有可无
注意事项:无

5.len

len
触发机制:当使用len函数去检测当前对象的时候自动触发
作用:可以使用len函数检测当前对象中的某个数据的信息
参数:一个self接收当前对象
返回值:必须有,并且必须是一个整型
注意事项:len要获取什么属性的值,就在返回值中返回哪个属性的长度即可

6.str

str
触发机制:当使用str或者print函数对对象进行操作时自动触发
作用:代替对象进行字符串的返回,可以自定义打印的信息
参数:一个self,接收当前对象
返回值:必须有,而且必须是字符串类型的值

7.bool

bool
触发机制:当前使用bool函数转换当前对象时,自动触发,默认情况下,对象会转为True
作用:可以代替对象进行bool类型的转换,可以转换任何数据
参数:一个self接收对象
返回值:必须是一个布尔类型的返回值

8.以上方法示例

#定义一个人类
class Person():
name = **’周杰伦’

  1. **_#初始化方法<br /> _**def **__init__(self,name,age):<br /> print(**'触发了初始化方法'**)<br /> self.name = name<br /> self.age = age
  2. _# 构造方法<br /> _**def **__new__(cls, *args):<br /> print(**'触发了构造方法'**)<br /> _# 如果在该方法中没有返回对象,则对象无法创建<br /> _**return **object.__new__(cls)
  3. _#__call__方法<br /> _**def **__call__(self, *args, **kwargs):<br /> print(**'触发了__call__方法'**)
  4. _#__len__方法:可以代替对象使用len函数,并返回一个指定的整型<br /> _**def **__len__(self):<br /> **return **len(self.name)
  5. _#__str__方法<br /> _**def **__str__(self):<br /> **return '这是当前脚本中的一个对象'
  6. **_#__bool__方法<br /> _**def **__bool__(self):<br /> **return **bool(self.name)<br /> _#析构方法<br /> _**def **__del__(self):<br /> print(**'触发了析构方法'**)<br /> **pass**

二.成员相关魔术方法

1getattribute

getattribute
触发机制:当访问对象成员时,自动触发,无论当前成员是否存在
作用:可以在获取对象成员时,对数据进行一些处理
参数:一个self接收对象,一个item接收当前访问的成员名称
返回值:可有可无,返回的值就是访问的结果
注意事项:在当前的魔术方法中,禁止进行成员访问,会触发递归.
如果想要在当前魔术方法中访问对象的成员必须使用object来进行访问
格式:object.getattribute(self,item)


2.getattr

getattr
触发机制:当访问对象中不存在的成员时,自动触发
作用:防止访问不存在的成员时报错,也可以为不存在的成员进行赋值操作
参数:一个self接收当前对象,一个item接收当前访问的成员名称
返回值:可有可无
注意事项:当存在getattribute方法时,会去执行getattribute方法


3.setattr

setattr
触发机制:当给对象的成员进行赋值操作时会自动触发(包括添加,修改)
作用:可以限制或管理对象成员的添加和修改操作
参数:1.self接收当前对象 2.设置的成员名 3.设置的成员值
返回值:无
注意事项:在当前的魔术方法中禁止给当前对象的成员直接进行赋值操作,会触发递归操作
如果想要给当前对象进行赋值,需要借助object
格式:object.setattr(self,item,value)


4.delattr

delattr
触发机制:当删除对象成员时自动触发
作用:可以限制对象成员的删除,还可以删除不存在的成员时防止报错
参数:1.self接收当前对象 2.item删除的成员名称
返回值:无
注意事项:在当前魔术方法中禁止直接删除对象的成员,会触发递归操作
如果要删除当前对象的成员,需要借助object
格式;object.delattr(self,item)

5.以上方法示例

class Person():
name = ‘名字’
age = ‘年龄’
sex = **’性别’

  1. def **__init__(self,name,age,sex):<br /> self.name = name<br /> self.age = age<br /> self.sex = sex
  2. **def **__getattribute__(self, item):<br /> **try**:<br /> res = object.__getattribute__(self,item)<br /> **return **res<br /> **except**:<br /> **return False
  3. def **__getattr__(self, item):<br /> res = **'属性不存在'<br /> return **res
  4. _#当给对象成员进行赋值时触发,如果该方法中没有给对象成员赋值,那么对象成员赋值失败<br /> _**def **__setattr__(self, key, value):<br /> object.__setattr__(self,key,value)
  5. _#当删除成员时,自动触发<br /> _**def **__delattr__(self, item):<br /> object.__delattr__(self,item)
  6. **def **say(self):<br /> print(**'聊聊天'**)
  7. **def **sing(self):<br /> print(**'唱歌'**)

zjl = Person(‘周杰伦’,36,‘男’)
print(zjl.sex)

zjl.address = ‘安徽宣城’
print(zjl.address)

三.成员访问的顺序

**1:调用getattribute魔术方法
2:调用数据描述符
3:调用当前对象的成员
4:调用当前类的成员
5:调用非数据描述符
6:调用父类的成员
7:调用getattr魔术方法

在调用每个成员时的顺序,前面的能够调用成功,后面不再执行**