1. 基本的自定义
__new__ 与 __init__
# 3.0 后不继承任何类默认继承 Object, python 2.2 新增的新式继承方法
class MyClass:
# __new__ 是一个 static method, args 是传入的参数 为 tuple类型, kwargs 为 dict 类型
def __new__(cls, *args, **kwargs):
print('new method', args, kwargs)
# 不能用 MyClass() 会死循环
return object.__new__(MyClass)
def __init__(self, name, g):
self.name = name
self.g = g
print('init method')
# 这里创建一根 MyClass 的对象, 首先会调用 __new__ 生产一个对象, 再调用 __init__ 进行一些初始化操作
# 自己没实现, 则会调用父类的 方法
o = MyClass("asdasd", "b")
# new method ('asdasd', 'b') {}
# init method
# 最终继承至 Object class
print(MyClass.mro()) # [<class '__main__.MyClass'>, <class 'object'>]
__del__
析构函数, 对象生命周期即将消失时调用的方法, 也有可能在 __del__
方法里面对对象进行再一次的引用(不推荐), 这种做法叫做resurrection
(耶稣复活), 这样析构函数就可能被调用多次, 目前 CPython 中的实现只会调用一次
__repr__ 和 __str__
都是美化对象的输出, 如果同时实现这两个方法, 会只输出__str__
方法中返回的字符串
__format__
返回一个在进行占位的字符串, 有额外参数formatspec
文档