我们不能失去信仰

我们在这个世界上不停地奔跑...

0%

Python装饰器装饰类

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
46
47
class PrintClassName(object):

def __init__(self, cls):
self._cls = cls

def __call__(self, *args, **kwargs):
"""
如果在类中实现了 __call__ 方法,那么实例对象就是一个可调用对象。 相当于 PrintClassName() 的时候回执行 __call__ 的内容
"""
print('我是 PrintClassName')
<!--more -->
print(self._cls.__name__)
return self._cls(*args, **kwargs)


@PrintClassName
class Person(object):
def __init__(self, a):
print('执行 Person __init__')
self.value = a

def sing(self):
print(self.value)


person = Person('今天又是充满希望的一天')
person.sing()
"""输出:
我是Foobar类
我是 PrintClassName
Person
执行 Person __init__
"""

"""
执行流程: 1. 创建 Person 前,先创建 PrintClassName,执行 __init__ 方法
2. 执行 PrintClassName 的 __call__ 方法
3. __call__ 返回创建 Person 的 type ,开始创建 Person ,执行 Person 的 __init__方法
4. person 自己调用 singl() 方法

看一下传入的东西是什么: 加入下面这句话到 PrintClassName 的 __init__ 方法里。
print(type(cls))
输出
<class 'type'>
说明传入的是创建 Person 使用的 type 。

"""

总结:

​ 装饰器装饰类的时候,其实是在创建类对象之前,执行装饰器里的操作,并且把创建类的 type 对象传递进去, 装饰器执行完后,返回创建对象的东西,然后才会创建对象。