创建类似logging.getlogger生成的基于伪单例密钥的对象
keyed-classes的Python项目详细描述
键控类
创建类似于由logging.getLogger
>>>fromkeyed_classesimportKeyedClass>>>classMyClass(KeyedClass)...def__init__(self,key):...self.key=key...>>>instance_one=MyClass('this is a key')>>>instance_two=MyClass('this is a key')>>>instance_three=MyClass('this is a different key')>>>instance_oneisinstance_twoTrue>>>instance_oneisinstance_threeFalse
note:需要对KeyedClass
方法进行一些思考。如果尝试创建一个新的实例可能只是返回一个先前创建的实例,那么对于__init__
中的代码和在其中创建的实例变量(以及其他什么)意味着什么?
这是一个详细的实现,但是在每次尝试创建一个新实例时,{{CD2>}中的代码将运行,^ {< CD6>},如果新的实例不存在,则引用新创建的实例,并且引用以前已使用过的密钥创建的原始实例。
如果您想避免子类化KeyedClass
,但出于任何原因仍然需要这样的东西,还有一个元类版本keyed_classes.KeyedClassMeta
,但我建议不要使用它,因为它不像keyed_classes.KeyedClass
那么友好。
>>>fromkeyed_classesimportKeyedClassMeta>>>classMyClass(metaclass=KeyedClassMeta)...def__init__(self,key):...self.key=key...>>>instance_one=MyClass('this is a key')>>>instance_two=MyClass('this is a key')>>>instance_three=MyClass('this is a different key')>>>instance_oneisinstance_twoTrue>>>instance_oneisinstance_threeFalse
note:两个实现之间的行为不完全相同。keyed_classes.KeyedClassMeta
类实际上每次请求一个实例时都会创建一个新实例(并且在这个新实例上运行__init__
方法),但是这个对象实际上只是在返回给用户之前被丢弃,而最初创建的对象则返回给用户。
我为什么要这个?
你可能不会!
一般来说,这是一个封闭的解决方案,它非常有效地使用(和隐藏用户)全局状态,我们都知道它是接近所有邪恶根源的东西。我提出这个方法是为了解决^{
importclickfromkeyed_classesimportKeyedClassclassMutuallyExclusiveOptionGroup(KeyedClass):def__init__(self,key):self.key=keyself.tripped=Falsedef__call__(self,ctx,param,value):ifvalueisNone:returnifself.tripped:op,_=self.optionraiseclick.BadParameter(f"'{op.name}' already specified, only one '{self.key}' option allowed in one invocation.")else:self.tripped=Trueself.option=(param,value)returnvalue@click.command()@click.option("--op1",callback=MutuallyExclusiveOptionGroup('method'))@click.option("--op2",callback=MutuallyExclusiveOptionGroup('method'))...defmain(op1,op2,...):...