如何为 Python 中的抽象 class 创建抽象属性?
How to create an abstract attribute for an abstract class in Python?
我已经发现一些类似的问题,他们试图创建抽象属性,他们都建议使用 @property
和 @abc.abstractmethod
来实现 here。有很多类似的主题,但我找不到不使用 @property
装饰器的方法。我不想使用它的原因是因为我不想在我的具体 class 中创建 setter
和 getter
方法。我只是想强制执行我的具体 classes 将具有特定属性,例如 self.filter_name
,它包含 class 名称的加密版本。
这是我目前使用 @property
和 @abc.abstractmethod
装饰器的摘要 class:
import abc
from typing import List
class DataFilter:
@property
@abc.abstractmethod
def filter_name(self)-> str:
"""Returns the filter name encrypted"""
pass
如果我执行上述操作并尝试将具体 class 中的 self.filter_name
属性设置为特定值,我会得到一个 AttributeError: can't set attribute
。我希望在我的具体 class.
中只包含类似 self.filter_name = "blabla"
的内容
执行此操作的方法不是使用 abstractmethod
,而是通过 __init_subclass__
。
class DataFilter:
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
try:
cls.filter_name
except AttributeError:
raise TypeError("Can't instantiate class DataFilter without name 'filter_name'")
您可以对 cls.filter_name
的值执行其他测试(如果存在)。
我已经发现一些类似的问题,他们试图创建抽象属性,他们都建议使用 @property
和 @abc.abstractmethod
来实现 here。有很多类似的主题,但我找不到不使用 @property
装饰器的方法。我不想使用它的原因是因为我不想在我的具体 class 中创建 setter
和 getter
方法。我只是想强制执行我的具体 classes 将具有特定属性,例如 self.filter_name
,它包含 class 名称的加密版本。
这是我目前使用 @property
和 @abc.abstractmethod
装饰器的摘要 class:
import abc
from typing import List
class DataFilter:
@property
@abc.abstractmethod
def filter_name(self)-> str:
"""Returns the filter name encrypted"""
pass
如果我执行上述操作并尝试将具体 class 中的 self.filter_name
属性设置为特定值,我会得到一个 AttributeError: can't set attribute
。我希望在我的具体 class.
self.filter_name = "blabla"
的内容
执行此操作的方法不是使用 abstractmethod
,而是通过 __init_subclass__
。
class DataFilter:
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
try:
cls.filter_name
except AttributeError:
raise TypeError("Can't instantiate class DataFilter without name 'filter_name'")
您可以对 cls.filter_name
的值执行其他测试(如果存在)。