对象相关的魔术方法

185 阅读2分钟

1.实例化对象相关的魔术方法

__init__:定义了初始化实例化对象的行为

__new__:定义了创建实例化对象的行为

__del__:定义了销毁实例化对象的行为,在对象生命周期结束时调用,又称析构函数

2.属性控制相关的魔术方法

__getattr__:定义了获取属性时属性不存在的行为

__setattr__:定义了给属性赋值的行为,该方法使用时要避免无限递归的错误。

错误示例:

class Sequence(object):
​
    def __setattr__(self, key, value):
        self.key = value

这里意味着每次给属性赋值的时候会调用setattr方法,但该方法内部也是一致赋值语句,内部再次调用自己,然后反复递归调用,造成程序彻底崩掉。

正确示例:

class Sequence(object):
​
    def __setattr__(self, key, value):
        self.__dict__[key] = value

__getattribute__:定义了获取属性的行为,无论属性是否存在都会触发该方法

3.可调用对象相关的魔术方法

__call__:允许一个类 实例如同函数一样被调用,即x.__call__()等价于x(),该方法接受可变参数。在实例对象被定义好后再去改变其行为时很有用。举例如下:

class Entity:
    def __init__(self, size, x, y):
        self.x, self.y = x, y
        self.size = size
​
    def __call__(self, x, y):
        '''改变实体的位置'''
        self.x, self.y = x, y
​
​
e = Entity(1, 2, 3)
print(e.x)
print(e.y)
​
e(4, 5)
print(e.x)
print(e.y)

result:

2
3
4
5

4.描述对象器相关的魔术方法

描述器是通过获取、设置或删除的时候被访问的类。当所创建的面向对象的数据库或类有相互依赖的属性时,描述对象器会很有用。最典型的场景莫过于使用不同的单位来表示同一数值。

__get__:用于描述对象器获取属性

__set__:用于描述对象器设置属性

__delete__:用于描述对象器删除属性 举例如下:

class Ton(object):
    """
    描述吨这个计量单位
    """
​
    def __init__(self, value=1):
        self.value = value
​
    def __get__(self, instance, owner):
        return self.value
​
    def __set__(self, instance, value):
        self.value = float(value)
​
​
class Catty(object):
    """
    描述斤这个计量单位
    """
​
    def __get__(self, instance, owner):
        return instance.ton * 2000
​
    def __set__(self, instance, value):
        instance.ton = value / 2000
​
​
class Weight(object):
    ton = Ton(3)
    catty = Catty()
​
​
w = Weight()
print(w.ton)
print(w.catty)

result:

3
6000