14 类的常用魔术方法举例

__init__()

class Fish(object):
    def __init__(self, name):
        self.name = name
        print("My name is: %s" % self.name)


f = Fish("fish_9527")

>>>

My name is: fish_9527

__new__()

例1

class Fish(object):
    def __new__(cls, *args, **kwargs):
        print("创建对象时,new 方法会被自动调用,然后分配空间")

    def __init__(self):
        print("Fish 类初始化")


f = Fish()

>>>

创建对象时,new 方法会被自动调用,然后分配空间

例2

class Fish(object):
    def __new__(cls, *args, **kwargs):
        print("创建对象时,new 方法会被自动调用")
        return super().__new__(cls)  # 为对象分配空间,并返回对象的引用

    def __init__(self):
        print("Fish 类初始化")


f = Fish()
print(f)

>>>

创建对象时,new 方法会被自动调用
Fish 类初始化
<__main__.Fish object at 0x000002769064EF28>

例3 单例模式1

class Fish(object):
    # 记录第一个被创建对象的引用
    instance = None
    
    def __new__(cls, *args, **kwargs):
        # 判断类属性是否是空对象
        if cls.instance is None:
            # 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 返回类属性保存的对象的引用
        return cls.instance


f1 = Fish()
print(f1)

f2 = Fish()
print(f2)

>>>

<__main__.Fish object at 0x000002769065B048>
<__main__.Fish object at 0x000002769065B048>

例4 单例模式2

  • 让初始化的动作只执行一次
class Fish(object):
    # 记录第一个被创建对象的引用
    instance = None
    init_flag = False
    
    def __new__(cls, *args, **kwargs):
        # 判断类属性是否是空对象
        if cls.instance is None:
            # 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 返回类属性保存的对象的引用
        return cls.instance

    def __init__(self):
        # 判断是否执行过初始化动作
        if Fish.init_flag:
            return
        # 若没执行过,则执行初始化动作
        print("Fish 类初始化")
        # 修改类属性的标记
        Fish.init_flag = True


f1 = Fish()
print(f1)

f2 = Fish()
print(f2)

>>>

Fish 类初始化
<__main__.Fish object at 0x00000276906632E8>
<__main__.Fish object at 0x00000276906632E8>

__call__()

>>> class A(object):
...     def __call__(self):
...         print("this is __call__")
...
>>> a = A()
>>> a
<__main__.A object at 0x000001DFDF94E5C0>
>>> print(a)
<__main__.A object at 0x000001DFDF94E5C0>
>>> 

__str__()

>>> class A(object):
...     def __str__(self):
...         return "this is __str__"
...
>>> a = A()
>>> a
<__main__.A object at 0x000001DFDF94EA58>
>>> print(a)
this is __str__
>>> 

__repr__()

例1

>>> class A(object):
...     def __repr__(self):
...         return "this is __repr__"
...
>>> a = A()
>>> a
this is __repr__
>>> print(a)
this is __repr__
>>> 

例2

>>> class A(object):
...     def __str__(self):
...         return "this is __str__"
...     def __repr__(self):
...         return "this is __repr__"
...
>>> a = A()
>>> a
this is __repr__
>>> print(a)
this is __str__
>>> 
原文地址:https://www.cnblogs.com/yorkyu/p/10693134.html