本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出。
property装饰器
功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能。
能够通过实例直接点出属性值来,更加方便快捷,如例三中student.age:
例一:
错误效果:
1 2 3 4 5 | class Student( object ): age = 20 student = Student() print (student.age) #打印结果为20 student.age = "二十" #不应该绑定为字符串的属性 |
为了避免如上行为,将代码更改为:
例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Student( object ): def __init__( self ): self ._age = None def age_getter( self ): #返回属性值 return self ._age def age_setter( self , age): #设置属性值 if isinstance (age, str ) and age.isdigit(): #验证绑定属性的类型 age = int (age) if isinstance (age, int ): self ._age = age else : raise ValueError( "age is illegal" ) #如果不能转换类型则抛出错误 student = Student() student.age_setter( "5" ) #绑定属性为字符串5 print (student.age_getter()) 打印结果为 5 , Int 格式 |
上述代码解决了属性绑定类型错误的问题,但是不够方便,Python自带的property装饰器能够帮助修饰代码,如下:
例三:
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 | class Student( object ): def __init__( self ): self ._age = None @property #装饰age函数,可以直接将age函数作为属性,直接通过等号绑定属性值 def age( self ): return self ._age @age .setter #通过setter设置age的属性,函数内部写验证规则 def age( self ,age): if isinstance (age, int ): self ._age = age return if isinstance (age, str ) and age.isdigit(): age = int (age) self ._age = age else : raise ValueError( "age is illegal" ) @age .deleter #deleter是删除属性方法 def age( self ): del self ._age student = Student() student.age = "20" print (student.age) # del student.age # print(student.age) |
staticmethod装饰器
功能:将被装饰的函数从类中分离出来,该函数不能访问类的属性,简单说可以将该函数理解为一个独立的函数,不允许使用self。
staticmethod 就是将该被装饰的函数与该类没有关系,该函数不能用self传参,需要和普通函数一样传参。
作用:
限制名称空间,这个函数虽然是个普通的函数,但只有这个类里能用到
代码易读性.静态方法并不需要self参数
约内存.不用每个实例都实例化方法.
在类内部控制静态方法.不然的话换一种实现方法,把函数放在在类外部
例四:
1 2 3 4 5 6 7 8 9 10 11 | class Dog( object ): def __init__( self ,name): self .name = name @staticmethod def eat(name,food): print ( "%s is eating %s" % (name,food)) d = Dog( "tom" ) d.eat( "tom" , "包子" ) #通过对象调用方法 Dog.eat( "jerry" , "面条" ) #通过类调用方法 |
classmethod装饰器,类装饰器
例五:
1 2 3 4 5 6 7 8 9 10 11 12 | class Dog( object ): name = "Jerry" def __init__( self ,name): self .name = name @classmethod def eat( self ): print ( "%s is eating %s" % ( self .name, "food" )) def talk( self ): print ( "%s is talking" % self .name) d = Dog( "Tom" ) d.eat() Dog.eat() |
工厂模式的一个方法
class method可以用来为一个类创建一些预处理的实例.
类方法只能找类变量,不能访问实例变量,
所以这里的name是jerry而不是实例化的tom