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版权协议,转载请附上原文出处链接和本声明。