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