目录
Python魔术方法是面向对象的Python中的内容,是特殊的方法,可以定义为向类中添加“magic”,总是被双下划线包围。
官方文档的描述 https://docs.python.org/zh-cn/3/reference/datamodel.html#special-method-names
1. __new__ 和 __init__
object.
__new__
(cls[, ...]) 和 object.__init__
(self[, ...])
__new_()
是在对象的实例化中被调用的第一个方法, 是一个静态方法,不需要显式地声明。它会将类作为第一个参数,其余参数传递给对象构造器表达式,返回值为新对象实例 。
__init_()是
类的初始化程序,在__new_()创建实例后
,__init_()
方法会以 __init__(self[, ...])
的形式被发起调用。
2. __repr__ 和 __str__
object.__repr__
(self) 和 object.
__str__
(self)
__repr__
()映射为内置函数repr(),__str__
映射为内置函数str(),都用于显示,__str__()用于显示给用户,而__repr__()用于显示给开发人员。
>>> class A:
def __repr__(self):
return('test repr')
def __str__(self):
return('test str')
>>> a = A()
>>> repr(a)
'test repr'
>>> str(a)
'test str'
3. with 语句上下文管理器
当对象的创建用with
语句包装时,上下文管理器允许对对象执行设置和清除操作。
上下文管理器的行为由两种魔术方法确定:
object.
__enter__
(self) 是在with
语句创建的代码块的开头应执行的操作。 with
语句将会绑定这个方法的返回值到 as
子句中指定的目标。
object.
__exit__
(self, exc_type, exc_value, traceback) 是在代码块已执行(或终止)之后应执行的操作。它可用于处理异常,执行清理或在执行块中的操作后立即执行总是执行的操作。
4. 一些魔术方法的调用
魔术方法 | 何时调用(示例) | 说明 |
---|---|---|
__new__(cls [,...]) | instance = MyClass(arg1, arg2) | __new__ 在实例创建时被调用 |
__init__(self [,...]) | instance = MyClass(arg1, arg2) | __init__ 在实例创建时被调用 |
__cmp__(self, other) | self == other ,self > other 等等。 | 要求进行任何比较 |
__pos__(self) | +self | 一元加号 |
__neg__(self) | -self | 一元减号 |
__invert__(self) | ~self | 按位反转 |
__index__(self) | x[self] | 使用对象作为索引时的转换 |
__nonzero__(self) | bool(self) | 对象的布尔值 |
__getattr__(self, name) | self.name # name doesn't exist | 访问不存在的属性 |
__setattr__(self, name, val) | self.name = val | 分配给属性 |
__delattr__(self, name) | del self.name | 删除属性 |
__getattribute__(self, name) | self.name | 访问任何属性 |
__getitem__(self, key) | self[key] | 使用索引访问项目 |
__setitem__(self, key, val) | self[key] = val | 使用索引分配给项目 |
__delitem__(self, key) | del self[key] | 使用索引删除项目 |
__iter__(self) | for x in self | 迭代 |
__contains__(self, value) | value in self , value not in self | 会员资格测试使用 in |
__call__(self [,...]) | self(args) | “调用”实例 |
__enter__(self) | with self as x: | with 语句上下文管理器 |
__exit__(self, exc, val, trace) | with self as x: | with 语句上下文管理器 |
__getstate__(self) | pickle.dump(pkl_file, self) | 序列化 |
__setstate__(self) | data = pickle.load(pkl_file) | 序列化 |
参考:https://blog.csdn.net/sinat_41104353/article/details/79254149