对内置装饰器的理解

装饰器就是用函数来包装函数,对内函数赋予一些我们所需要的功能,Python有三个内置的装饰器:staticmethod,classmethod和property,这三个装饰器都是和类相关的.

@staticmethond

一般情况,要使用类的方法,需要先实例化一个对象再调用方法,使用staticmethod(静态方法)之后,可以直接使用类来进行方法的访问,不需要事先进行实例化,这样做的好处就是可以将属于这个类的函数放到静态方法中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class test(object):

class_arr = 1
# 对象方法
def A(self):
print('A')

# 静态方法
@staticmethod
def B():
print('B')

# 实例化对象
foo = test()
foo.A()
foo.B()
test.B()
test.A()
1
2
3
4
5
6
7
A
B
B
Traceback (most recent call last):
File "C:\Users\29427\Desktop\reivew.py", line 36, in <module>
test.A()
TypeError: A() missing 1 required positional argument: 'self'

可以看出,使用静态方法装饰的方法,类可以直接访问,而没有被装饰的方法,类是无法访问的,并且装饰的方法是不用传入self的

@classmethod

类方法和静态方法很相似,区别在于静态方法装饰的方法是不需要传入self的,而类方法装饰的方法是需要传入一个隐式的对象作为参数,这个隐式的对象在有继承时表示相应的子类,在无继承时表示当前类

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
class Parent(object):

@staticmethod

def staticSayHello():

print ("Parent static")



@classmethod

def classSayHello(cls):

if cls == Boy:

print ("Boy classSayHello")

elif cls == Girl:

print ("girl sayHello")


class Boy(Parent):

pass


class Girl(Parent):

pass

Boy.classSayHello()
Girl.classSayHello()
1
2
Boy classSayHello
girl sayHello

可以看出这个隐式的类参数可以进行类的区分

@property

该装饰器可以将方法变成属性,在进行访问时就不能像访问方法那样进行访问,要用访问属性的方式进行访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Student(object):

@property
def score(self):
return self._score

@score.setter
def score(self,value):
if not isinstance(value, int):
raise ValueError('分数必须是整数才行呐')
if value < 0 or value > 100:
raise ValueError('分数必须0-100之间')
self._score = value
s = Student()
s.score = 60
s.set_score(60)
s.score
s.get_score()

使用property来装饰score时会自动创建一个新的setter装饰器,使用setter可以对属性进行赋值,这样做的话,对一个属性的查询和修改就会简单很多.