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),定义一个属性被删除时的行为。