Python 特殊函数


# Python 特殊函数

介绍一些 Python 常用的魔术方法,如 __init____new__ 等。

# __init__

这是一个实例函数,主要是用来初始化对象属性的,当对象创建的时候,就会自动调用这个函数,如果有属性时,会给对象赋予相应的属性

#__init__函数
class A:
    def __init__(self, name):  # 实例方法
        print('开始给对象赋予属性了')
        self.name = name
a = A("hello")
print(a.name)
--------------------------------------------
开始给对象赋予属性了
hello
1
2
3
4
5
6
7
8
9
10

# __new__

这是个类方法,用来创建对象,创建对象的时候最先调用的方法,通常会用来做单例模式和对象创建计数,*args**kwargs 是用来接收和传递创建对象时的参数

class A:
    def __init__(self, name, age):  # 实例方法
        print('开始给对象赋予属性了')
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs): # 类方法
        print('开始新建对象了')
        print('我是参数args', args)
        print('我是参数kwargs', kwargs)
        return object.__new__(cls)
        # 必须要有返回值 返回创建出来的实例

a = A('小明', 2)
print(a.name,a.age)
-------------------------------------------------
开始新建对象了
我是参数args ('小明', 2)
我是参数kwargs {}
开始给对象赋予属性了
小明 2
--------------------------------------------------------

class A:
    def __init__(self, name, age=1):  # 实例方法
        print('开始给对象赋予属性了')
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs): # 类方法
        print('开始新建对象了')
        print('我是参数args', args)
        print('我是参数kwargs', kwargs)
        return object.__new__(cls)
        # 必须要有返回值 返回创建出来的实例


a = A('小明', age=2)
print(a.name,a.age)
-------------------------------------------------
开始新建对象了
我是参数args ('小明',)
我是参数kwargs {'age': 2}
开始给对象赋予属性了
小明 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

由上面的例子可以看出,此函数会在__init__函数之前调用,返回一个实例对象

# __del__

对象不在被变量引用时,删除该对象的引用,由垃圾回收机制回收相应的内存,方式有两种:

  • 当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数会被调用一次,这样可以删除对象引用
class A:
    def __init__(self):
        print("实例被初始化")

    def __del__(self):
        print("实例被销毁")

a = A()
print('我是最后一行代码')
--------------------------------------------------
实例被初始化
我是最后一行代码
实例被销毁
1
2
3
4
5
6
7
8
9
10
11
12
13

执行到 a = A() 后,由于当前作用域中还有一行代码,在执行最后一行代码后,执行了 A 中的析构函数,删除了 a 的引用

  • 当使用 del 删除对象时,会调用他本身的析构函数, 删除了 a 的引用
class A:
    def __init__(self):
        print("实例被初始化")

    def __del__(self):
        print("实例被销毁")

a = A()
del a
print('我是最后一行代码')
1
2
3
4
5
6
7
8
9
10

del a 语句执行时候, 内存立即被回收, 即执行打印"实例被销毁". 最后才是执行打印"我是最后一行代码"

# __call__

类中实现这一方法可以使该类的实例(对象)像函数一样被调用

class People:
    def __init__(self,name):
        self.name = name

    def __call__(self, *args, **kwargs):
        print('hello '+ self.name)

p = People("Alex")
p.__call__()     # 调用方式一
p()              # 调用方式二
1
2
3
4
5
6
7
8
9
10

(完)