Python 中类的内置方法(魔法函数)

Python 中类的内置方法(魔法函数)

凡是在类内部定义,以_ _ xx _ _ 结尾的方法,都是类的内置方法,也称之为魔法方法

注意:类的内置方法,会在某种条件满足下自动触发

常用内置方法:

1、__init__

在调用类时自动触发,通过object类产生的空对象自动调用__init__(),重写__init__方法可以控制对象的初始化过程。

def __init__(self):
    print("此处是__init__方法的执行..")

2、__new__

在__init__触发前自动触发,调用该类时,方法是真正的类构造方法,用于产生实例化对象(空属性)。重写__new__方法可以控制对象的产生过程,必须有 return 返回值

def __new__(cls, *args, **kwargs):
	print("此处是__new__方法的执行..")
    return object.__new__(cls, *args, **kwargs)

使用__new__来处理单例模式:

class Student:
    __instance = None
 
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance
 
    def sleep(self):
        print('sleeping...')
 
stu1 = Student()
stu2 = Student()
 
print(id(stu1), id(stu2))  # 两者输出相同
print(stu1 is stu2)  # True

3、__str____repr__

两者的目的都是为了显式的显示对象的一些必要信息,方便查看和调试。__str__print默认调用,__repr__被控制台输出时默认调用。即,使用__str__控制用户展示,使用__repr__控制调试展示。

  • str() 的输出追求可读性,输出格式要便于理解,适合用于输出内容到用户终端。
  • repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用。
>>> from datetime import datetime
>>> now = datetime.now()
>>> print(str(now))
2017-04-22 15:41:33.012917
>>> print(repr(now))
datetime.datetime(2017, 4, 22, 15, 41, 33, 12917)

4、__call__

__call__方法提供给对象可以被执行的能力,就像函数那样,而本质上,函数就是对象,函数就是一个拥有__call__方法的对象。

__call__()方法能够非常方便的实现装饰器。以下是一个简单的装饰器的例子:

class ClsDeco:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(f'Running {self.func.__name__}')
        self.func()
        print('End')

@ClsDeco  # 等价于 bar = ClsDeco(bar)
def foo():
    print('do something')

foo()
# 输出结果
# Running foo
# do something
# End

5.__del__

__del__用于当对象的引用计数为0时自动调用。
__del__一般出现在两个地方:

1、手工使用del减少对象引用计数至0,被垃圾回收处理时调用。

2、程序结束时调用。__del__一般用于需要声明在对象被删除前需要处理的资源回收操作


版权声明:本文为qq_50840738原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。