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

    经过该装饰器后类可以无需实例化调用装饰过的函数