Python小技巧
-
将类的方法变化为属性:
使用装饰器:@property
首先看一个简单的对类的操作:
class User(object):
pass
a = User()
a.password=123
这样可以给实例化的对象a添加属性"password",值为123,而如果要更细致地操作这个属性则需要在类中添加方法来修改属性,例如:
class User(object):
def set_passwd(self,value):
if not isinstance(value,int):
raise ValueError('passwd must be integer')
self.password = value
通过调用类的方法可以对类的属性进行更细致的操作,但是python有更优雅的解决方案,就是通过@property
装饰器,这个装饰器我也只是明白了皮毛,没有深入的了解,举一个学习《flask web开发》中的例子:class User(object):
@property
def password(self):
raise AttributeError('password is not readable')
@passwrod.setter
def password(self,password):
self.password_hash = generate_password_hash(password)
这里的"generate_password_hash"函数是一个将密码加密的函数,重点是在使用@property
装饰器后,定义的"password"的方法可以像属性一样去访问,而使用该装饰器后会自动生成一个"setter"方法,通过这个方法装饰后可以通过属性赋值的方式来调用方法,简单来说就是直接访问该属性会调用getter方法即第一个password()方法,而对该属性赋值会调用setter方法即第二个password()方法,效果如下:mika = User()
mika.password
这种类似访问属性的方式会直接调用User类中的password方法,此时会抛出异常,这样就达成了User类中的password属性是只可写不可读的
maki.password = 123
这样类似于调用setter中的方法,该方法的参数是password,然后生成一个哈希散列值,赋值给password_hash属性,然后对外可见的属性则是password_hash,这样能大大增加安全性,并且我们在使用的时候访问的都是password这个属性,使操作属性这个动作变得非常优雅 -
@staticmethod
经过该装饰器后类可以无需实例化调用装饰过的函数