类的特殊方法前后缀包含两个下划线"__", 这些方法可以在子类重写,并在子类中通过super()
可以调用父类的同名方法
__new__方法
用于创建一个实例.该方法会在实例化自动的执行.如果该方法返回的是一个实例对象, 则会自动调用__init__
方法.
所以当实例化一个类时, 先执行__new__
创建实例, 再通过__init__方法初始化
class A:
def __new__(cls, *args, **kwargs):
# 调用父类的__new__创建实例
return super().__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
pass
a = A()
__init__方法
实例初始化方法,__new__
创建实例后调用.该方法不应该返回任何值
当需要调用父类的__init__方法, 必须通过super()来调用
class A:
def __init__(self, *args, **kwargs):
self.a = kwargs['a']
super().__init__(self, *args, **kwargs)
a = A(1,2, 3,a=10)
__del__方法
当一个对象的引用计数清零时, 会触发该方法
class A:
def __del__(self):
print(f"{self}已删除")
a = A()
# 这里a没有其他引用, del a会直接触发__del__
del a
a = A()
# 这里对a创建了一个引用
b = a
# del a并不能使a的引用变为0, 所以不会触发__del__
del a
__hash__方法
调用hash函数对hash集成员进行hash计算.hash结果是一个整数
只有不可变类型才可以被hash
1 .__hash__()
"hello".__hash__()
[].__hash__()
().__hash__()
{}.__hash()__()
set().__hash__()
__call__方法
模拟可调用对像, 当一个类定义了__call__
方法后, 可以像函数一样调用
class A:
def __call__(self, *args):
print(args)
a1 = A()
print(a1(1, 2, 3))
讨论区