在研究抽象类的时候,遇到一个关于父类的抽象属性的问题。
示例代码:
import abc
from abc import ABC, abstractmethod
class parent(ABC):
@abc.abstractproperty
def someMethod(self):
return "parent class"
class child(parent):
@property
def someMethod(self):
return "child class"
try:
obj = parent()
print(obj.someMethod)
except Exception as ex:
print(ex)
obj = child()
print(obj.someMethod)
结果:
Can't instantiate abstract class parent without an implementation for abstract method 'someMethod'
child class
如果我们使用@abstractproperty
,我们是否需要父类中的属性?
UPD:根据解释器的判断,我们可以创建子类的实例,但不能创建父类的实例?即使具有相同的语义?
通过在某个方法之前使用装饰器
@abstractmethod
,我们表明父类的该方法是抽象的,需要子类实现。通过指定装饰器@property
,我们可以将方法转换为类属性。@abstractmethod
在子类中使用装饰器而不实现的示例:结果:
@abstractmethod
在子类中使用带有方法实现的装饰器的示例:结果:
用法
@property
:没有装饰器: