一、特殊方法
1、if __name__ = '__main__'
阻止自动调用
__name__
是Python中的一个内置变量,表示模块名或程序名。当执行一个模块时,Python会自动将该模块的__name__
设置为字符串"__main__"
。因此,当在一个模块中使用if __name__ = '__main__'
语句时,表示只有在该模块直接被执行时,该语句才会被执行,例如:
"""文件a"""
class MyClass(object):
def func1(self):
print('func1...')
if __name__ == '__main__':
MyClass().func1()
"""文件b"""
import a
print('func2...')
文件b导入文件a模块,执行文件b,输出结果:
func1...
func2...
从输出结果可以看出来,文件a中的模块被自动调用了(输出func1…)。使用
if __name__ = '__main__'
语句解决模块a中的方法被自动调用的问题,如下:
"""文件a"""
class MyClass(object):
def func1(self):
print('func1...')
if __name__ == '__main__':
MyClass().func1()
"""文件b"""
import a
print('func2...')
修改完成后重新按照前面的方式执行,输出结果如下:
func2...
文件a中的模块无法被自动调用,仅输出func2…
2、__new__
调用以创建一个 cls 类的新实例。
__new__()
是一个静态方法 (因为是特例所以你不需要显式地声明),它会将所请求实例所属的类作为第一个参数。其余的参数会被传递给对象构造器表达式 (对类的调用)。__new__()
的返回值应为新对象实例 (通常是 cls 的实例),函数声明,如下:
object.__new__(cls[, ...])
类的实例化都一定包含两个步骤: (1)在内存中创建对象,即开辟一块内存空间来存放类的实例(Instance); (2)初始化对象,即给实例的属性赋予初始值。因此、
__new__()
方法的作用通俗的讲就是给创建的类对象分配内存空间。__new__()
的目的主要是允许不可变类型的子类 (例如 int, str 或 tuple) 定制实例创建过程。它也常会在自定义元类中被重载以便定制类创建过程。
3、__init__
在实例通过
__new__()
被创建之后,返回调用者之前调用。主要作用就是定义类实例属性,以及对实例属性进行初始化,函数声明,如下:
object.__init__(self[, ...])
一个基类如果有 init() 方法,则其所派生的类如果也有 init() 方法,就必须显式地调用它以确保实例基类部分的正确初始化,例如:
super().__init__([args...])
因为对象是由
__new__()
和__init__()
协作构造完成的 (由__new__()
创建,并由__init__()
定制),所以__init__()
返回的值只能是None
,否则会在运行时引发TypeError
。
4、__del__
在实例将被销毁时调用,回收内存(Python自动调用),例如:
class MyClass(object):
def __init__(self):
print('开始执行程序')
def __del__(self):
print('程序执行完毕,回收内存!')
my_class = MyClass()
输出结果:
开始执行程序
程序执行完毕,回收内存!
注意:
del x
并不直接调用x.__del__()
前者会将 x 的引用计数减一,而后者仅会在 x 的引用计数变为零时被调用。