魔法方法

mac2022-06-30  41

  1、__init__(self [,...])一个类中是否存在__init__取决于需求。注意:__init__方法只能返回None,否则会报错。相当于java、c++中的构造方法。

  2、__new__(cla [,...])——实例化对象时调用的第一个方法,它的第一个参数不是self,而是这个类cls,然后将其他参数传递给__init__.

 

  3、__del__(self),

  4、__setattr__(self),定义一个属性被设置时的行为,即只要有属性赋值行为,就会调用__setattr__(self)方法。

class Rectangle: def __init__(self,width=0,hight=0): self.width = width sellf.hight =hight def __setattr__(self,name,value): if name == 'square': self.width = value self.hight = value else: self.name = value def getArea(self): return self.width*self.hight## 直接调用会陷入死循环

r1 = Rectangle()Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> r1 = Rectangle() File "G:/0工作面试/学习记录/python/magic.py", line 4, in __init__ self.width = width File "G:/0工作面试/学习记录/python/magic.py", line 12, in __setattr__ self.name = value File "G:/0工作面试/学习记录/python/magic.py", line 12, in __setattr__ self.name = value File "G:/0工作面试/学习记录/python/magic.py", line 12, in __setattr__ self.name = value

  原因:实例化时,self.width = width触发__setattr__方法,而__setattr__中也有 self.name =value,所有不停的调用本身,陷入死循环。

  解决办法:

  1、调用object类的__setattr__方法,即用 "super().setattr__(name,value)" 替换 "self.name =value",

  2、利用__dict__方法,self.__dict__[name] = value 代替  "self.name =value" 。

  注意:很多魔法方法都会遇到类似的死循环问题,一般采取调用基类的对应的魔法方法来规避。

  5、__getattrute__(self),定义该类的属性被访问时的行为。

  6、__getattr__(self),定义当用户试图获取一个不存在的属性时的行为。

  7、__delattr__(self),定义一个属性被删除时的行为。

 

转载于:https://www.cnblogs.com/Chris-01/p/10528896.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)