赞
踩
凡是在类内部定义,以_ _ xx _ _ 结尾的方法,都是类的内置方法,也称之为魔法方法
注意:类的内置方法,会在某种条件满足下自动触发
常用内置方法:
__init__
在调用类时自动触发,通过object类产生的空对象自动调用__init__()
,重写__init__
方法可以控制对象的初始化过程。
def __init__(self):
print("此处是__init__方法的执行..")
__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
__str__
和 __repr__
两者的目的都是为了显式的显示对象的一些必要信息,方便查看和调试。__str__
被print
默认调用,__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)
__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
__del__
__del__
用于当对象的引用计数为0时自动调用。
__del__
一般出现在两个地方:
1、手工使用del减少对象引用计数至0,被垃圾回收处理时调用。
2、程序结束时调用。__del__
一般用于需要声明在对象被删除前需要处理的资源回收操作
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。