请稍候,加载中....

类的特殊方法(一)

类的特殊方法前后缀包含两个下划线"__", 这些方法可以在子类重写,并在子类中通过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))

 


Python学习手册-