Python 编程基础 | 第五章-类 | 5.6、特殊方法

一、特殊方法

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 的引用计数变为零时被调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值