常用装饰器

简介

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
48
49
50
51
52
53
54
# coding:utf-8

class Test():
def __init__(self,a):
self.a = a
def run(self):
print('run')
self.dump() # self的类函数,可以调用cls修饰的类函数,反之不行。
self.sleep() # self的类函数,可以调用static修饰的类函数,反之不行。

# classmethod :
# 将类函数可以不经过实例化而直接调用。
@classmethod
def dump(cls): # classmethod调用的类函数 ,要参数cls。
print('dump')
# cls.run() # 实现了classmethod装饰器的类函数,调用不了self的类函数。

# staticmethod :
# 将类函数可以不经过实例化而直接被调用,被该装饰器调用的函数不许传递self或cls参数,
# 且无法在该函数内调用其它类函数或类变量。
@staticmethod
def sleep():
print('i want sleep')
# run() 实现了static method装饰器的类函数,调用不了self的类函数。

t = Test('a')
t.run()
t.dump()
Test.dump()
Test.sleep()
t.sleep()
print('~~~~~~~~~~~~~~`\n')

class Test1():
def __init__(self,name):
self.__name = name # 注意Test1 没有属性name,只有私有属性__name。

#property 修饰让 类内函数在被调用时,不用打括号。
@property
def name(self):
return self.__name
# 如果想要向name函数传参,只能如下做法。
# 使用name里的setter修饰器方法
@name.setter # 来向property修饰的name函数传参。
def name(self,value):
self.__name = value # 改变私有变量__name.
# 这样调用时可以用赋值的形式向name方法传参了。

t1 = Test1(name='dewei')
print(t1.name) # 调用方法name,不用打括号,同时不能传参。
t1.name = '小木' # 赋值的形式向name方法传参。
print(t1.name)