@abstractmethod:抽象方法(转载)
@abstractmethod:抽象方法,含abstractmethod方法的类不能实例化,继承了含abstractmethod方法的子类必须复写所有abstractmethod装饰的方法,未被装饰的可以不重写
@ property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用
@ classmethod:类方法,可以通过实例对象和类对象调用,被该函数修饰的方法第一个参数代表类本身常用cls,被修饰函数内可调用类属性,不能调用实例属性
@staticmethod:静态方法,可以通过实例对象和类对象调用,被装饰函数可无参数,被装饰函数内部通过类名.属性引用类属性或类方法,不能引用实例属性
@ property:方法伪装属性,方法返回值及属性值,被装饰方法不能有参数,必须实例化后调用,类不能调用
@ classmethod:类方法,可以通过实例对象和类对象调用,被该函数修饰的方法第一个参数代表类本身常用cls,被修饰函数内可调用类属性,不能调用实例属性
@staticmethod:静态方法,可以通过实例对象和类对象调用,被装饰函数可无参数,被装饰函数内部通过类名.属性引用类属性或类方法,不能引用实例属性
案例讲解:
@abstractmethod
用于程序接口的控制,正如上面的特性,含有@abstractmethod修饰的父类不能实例化,但是继承的子类必须实现@abstractmethod装饰的方法
# -*- coding:utf-8 -*- 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** 第三个实例化是正确的
转载于:Python装饰器abstractmethod、property、classmethod、staticmethod及自定义装饰器