python中的装饰器:@staticmethod,@classmethod,@abstractmethod ,@property

目录

 1.@staticmethod

 2.@classmethod

3.@abstractmethod 

4.@property


装饰器应用场景

  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数前预备处理
  4. 执行函数后清理功能
  5. 权限校验等场景
  6. 缓存

 1.@staticmethod

修饰类方法,静态方法。不传入代表实例对象的self参数,并且不强制要求传递任何参数,可以被类直接调用。静态方法是独立于类的一个单独函数,只是寄存在一个类名下。

静态方法就是类对外部函数的封装,有助于优化代码结构和提高程序的可读性。

class Test:
      def __init__(self,num):
            self.num = num;
      def cout_num(self):
            print(self.num)
      @staticmethod
      def print_num():
            print("Hello World")         
if __name__ == "__main__":
      obj = Test(10)
      """实例化成员方法"""
      obj.cout_num()
      """直接访问静态方法"""
      Test.print_num()
      """实例化 访问静态方法"""
      obj.print_num()

 2.@classmethod

修饰类方法。不传入self示例本身,而是传入cls,代表这个类自身,可以来调用类的属性,类的方法,实例化对象等。类方法是将类本身作为操作对象。当我们需要和类直接进行交互,而不需要和实例进行交互时,自然也就不需要传入实例本身

class A(object):
    num = 1

    def func1(self):
        print('func1')

    @classmethod
    def func2(cls):
        print('func2')
        print(cls.num)
        cls().func1()


if __name__ == '__main__':
    A.func2()

------------------------------
>>> func2
>>> 1
>>> func1

3.@abstractmethod 

抽象方法。用于程序接口的控制。含有abstractmethod 方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的不重写。

import abc

class Set(metaclass=abc.ABCMeta):
    def __int__(self,value):
        self.value = value
    
    @abc.abstractmethod
    def config(self):
        """
        an abstract method need to be implemented
        """

#子类
class Mode(Set):

    def config(self,value): #必须重写这个方法
        return value

4.@property

 将一个方法伪装成属性。被修饰的特性方法,内部可以实现处理逻辑,但对外提供统一的调用方式(访问方式很友好),实现一个示例属性get、set、delete三种方法的内部逻辑。

-只有@property表示 只读 。

-同时有@property和@*.setter表示 可读可写 。修改属性

-同时有@property和@*.setter和@*.deleter表示可读可写可删除属性。

例1: 

class Cimer(object):  #需继承父类object,否则property等无法生效

  def __init__(self, value = 0.0):
    self._time = value
    self._unit = 's'

  # 使用装饰器的时候,需要注意:
  # 1. 装饰器名,函数名需要一致
  # 2. property需要先声明,再写setter,顺序不能倒过来
  @property
  def time(self): # 相当于time属性的getter方法
    return str(self._time) + ' ' + self._unit

  @time.setter
  def time(self, value):
    if(value < 0):
      raise ValueError('Time cannot be negetive.')
    self._time = value

t = Cimer()
t.time = 1.0
print(t.time)

例2: 

class MyClass(object):
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = value

    @value.getter
    def value(self):
        return self._value

    @value.deleter
    def value(self):
        del self._value

c1 = MyClass(10)
print(c1.value) # 10
c1.value = 20
print(c1.value) # 20
del c1.value # _value成员被删除
print(c1.value) # 报_value不存在的错误

 

你可能感兴趣的:(python,python,学习)