python 装饰器
1. abstractmethod
-
抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写
-
用于程序接口的控制,含有@abstractmethod修饰的父类不能实例化,但是继承的子类必须实现@abstractmethod装饰的方法
from abc import ABC, abstractmethod
class A(ABC):
@abstractmethod
def test(self):
pass
class B(A):
def test_1(self):
print("未覆盖父类abstractmethod")
class C(A):
def test(self):
print("覆盖父类abstractmethod")
if __name__ == '__main__':
a = A()
b = B()
c = C()
#前两个分别报错如下:
# a = A()
# TypeError: Can't instantiate abstract class A with abstract methods test
# b = B()
# TypeError: Can't instantiate abstract class B with abstract methods test
# 第三个实例化是正确的
2. property
-
方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用
-
将一个方法伪装成属性,被修饰的特性方法,内部可以实现处理逻辑,但对外提供统一的调用方式,实现一个实例属性的get,set,delete三种方法的内部逻辑。
class Data:
def __init__(self):
self.number = 123
@property
def operation(self):
return self.number
@operation.setter
def operation(self, number):
self.number = number
@operation.deleter
def operation(self):
del self.number
3. classmethod
-
类方法,可以通过实例对象和类对象调用,被该函数修饰的方法第一个参数代表类本身常用cls,被修饰函数内可调用类属性,不能调用实例属性
-
使用@classmethod是为了处理一些__init__处理不了的赋值问题(一般是参数不对应),你可以当成,有第二,第三个__init__方法,当然它要通过类名显示调用
4. staticmethod
-
静态方法,可以通过实例对象和类对象调用,被装饰函数可无参数,被装饰函数内部通过类名.属性引用类属性或类方法,不能引用实例属性
-
使用@staticmethod目的之一是为了增加可读性,不需要参数self的方法都可以加上@staticmethod增加可读性,因为,这个方法是类级别的,在调用时要使用类名。
5. classmethod vs staticmethod
classmethod与staticmethod都是类级别的方法(可以简单理解为不需要self,也不能调用需要self的方法,需要self的都是实例级别的方法),类级别的方法,在类定义时就存在。所以你在调用时不是先实例化一个类,再调用参数,而是,直接使用类里的方法。
类方法classmethod和静态方法staticmethod是为类操作准备,是将类的实例化和其方法解耦,可以在不实例化的前提下调用某些类方法。两者的区别可以这么理解:类方法是将类本身作为操作对象,而静态方法是独立于类的一个单独函数,只是寄存在一个类名下。类方法可以用过类属性的一些初始化操作。
class Test:
num = "aaaa"
def __init__(self):
self.number = 123
@classmethod
def a(cls, n):
cls.num = n
print(cls.num)
@classmethod
def b(cls, n):
cls.a(n)
@classmethod
def c(cls, n):
cls.number = n
@staticmethod
def d(n):
Test.b(n)