有没有办法在python中为类声明一个抽象实例变量?
例如,我们有一个抽象基类Bird
,其抽象方法fly
使用abc
包实现,而抽象作为属性实现的实例变量 feathers
(我正在寻找的)。
from abc import ABCMeta, abstractmethod
class Bird(metaclass=ABCMeta):
@property
@abstractmethod
def feathers(self):
"""The bird's feathers."""
@abstractmethod
def fly(self):
"""Take flight."""
问题是 Eagle
是 Bird
的派生类,需要将 feathers
实现为属性方法。所以下面不是一个可接受的类,但我希望它是
class Eagle(Bird):
def __init__(self):
self.feathers = 'quill'
def fly(self):
print('boy are my arms tired')
这可能是一个问题,因为需求是针对实例本身的,而且实际上是在实例化之后,所以我不知道像 abc
包这样的东西是否仍然有效。
是否有一些标准的方法来处理这个问题?
最佳答案
abc
系统不包含声明抽象实例变量的方法。确定类是具体类还是抽象类的代码必须在任何实例存在之前运行;它可以很容易地检查一个类的方法和属性,但它无法判断实例是否将具有任何特定的实例属性。
最接近的可能是变量注解:
class Bird(metaclass=ABCMeta):
feathers : str
...
abc
不会对该注解做任何事情,但它至少向读者和静态类型检查器表明 Bird
的实例应该有一个 feathers
实例变量。 (静态类型检查器是否会理解这个实例变量应该来自子类,我不知道。)
关于Python:抽象实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51055750/