1.构造和析构
_ _init_ _
它相当于其他面向对象编程语言的构造方法,也就是类在实例化成对象的时候首先会调用的一个方法
class A: def __init__(self, x, y): self.x = x self.y = y def getArea(self): return self.x * self.y a = A(2, 4) print(a.getArea()) # 8
_ _new_ _
_ _new_ _()才是在一个对象实例化的时候调用的第一个方法。它与其他魔法方法不同,它的第一个参数不是self而是这个类(cls),而其他的参数会直接传递给_ _init_ _()方法
_ _new_ _()方法平时很少去重写它,一般让Python用默认的方案执行就可以了。但是有一种情况需要重写这个魔法方法,就是当继承一个不可变的类型的时候,它的特性就显得尤为重要了
该类会改变str的默认行为,使之返回全部大写的字符串:
class A(str): def __new__(cls, string): string = string.upper() return str.__new__(cls, string) a = A("I Love You!") print(a) # I LOVE YOU!
2.属性访问
属性相关的魔法方法:
实例: class C: def __getattribute__(self, item): print("属性被访问!") return super().__getattribute__(item) def __setattr__(self, key, value): print("属性已被设置!") super().__setattr__(key, value) def __delattr__(self, item): print("属性已被删除!") super().__delattr__(item) def __getattr__(self, item): print("访问的属性不存在") c = C() c.x # 属性被访问! # 访问的属性不存在 c.x = 1 # 属性已被设置! c.x # 属性被访问! del c.x # 属性已被删除!
3.描述符
描述符相关的魔法方法:
实例:
由于MyDescriptor实现了_ _get_ _()、_ _set_ _()和_ _delete_ _()
方法,并且将它的类实例指派给Test类的属性,所以MyDescriptor就是描述符类
实例化Test类,然后尝试对x属性进行各种操作,看看描述符类会有怎样的响应:
当访问x属性的时候,Python会自动调用描述符的_ _get_ _()
方法,几个参数的内容分别是:self
是描述符类自身的实例;instance
是这个描述符的拥有者所在的类的实例,在这里也就是Test类的实例;owner
是这个描述符的拥有者所在的类本身