python 装饰器

1. 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


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

4. 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)
Table of Contents