假设我的类有这样的架构:
# abstracts.py
import abc
class AbstractReader(metaclass=abc.ABCMeta):
@classmethod
def get_reader_name(cl):
return cls._READER_NAME
@classmethod
@property
@abc.abstractmethod
def _READER_NAME(cls):
raise NotImplementedError
# concretes.py
from .abstracts import AbstractReader
class ReaderConcreteNumber1(AbstractReader):
_READER_NAME = "NAME1"
class ReaderConcreteNumber2(AbstractReader):
_READER_NAME = "NAME2"
我也有一个管理器类,它通过_READER_NAME
变量找到具体的类,所以我需要为每个具体的类定义唯一的_READER_NAME
。
当要定义具体类时,如何检查NAME1
和NAME2
是否唯一?
2条答案
按热度按时间isr3a4wc1#
您可以使用建构函式建立中继类别,该建构函式使用集合来追踪每个执行严修化类别的名称,如果集合中已经存在指定的名称,则会引发例外状况:
并使其成为
AbstractReader
类的元类。由于Python不允许一个类拥有多个元类,因此需要使AbstractReader
继承自abc.ABCMeta
,而不是将其作为元类:或者,如果您想在
AbstractReader
中使用ABCMeta
作为元类,只需覆盖ABCMeta
类并在AbstractReader
中将子ABC设置为metaclass
:这样一来:
将产生:
演示:https://replit.com/@blhsing/MerryEveryInternet
2guxujil2#
这是一个非常特殊的情况,但可以用singleton pattern来解决。
为了方便我们自己,我们首先创建一个单例注解
现在我们构造一个单例Registry类,用注册我们的类并进行检查。
现在,您可以
如果注册表中已经存在一个同名的读取器,那么一旦导入文件,就会抛出异常。现在,您只需在注册表中查找要构造的类的名称,例如: