创建类似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,...):...

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Spring框架服务单元测试   在Java中遍历hashmaps的hashmap以检索字符串值   如何使用CodeQL检查Java注释是否具有特定属性?   java为什么在Spring Boot中访问此资源而不是登录弹出窗口需要始终获得完全身份验证   处理将多集计数转换为列表的过程   java另一个线性布局,没有出现按钮   eclipse Java映像加载未显示在jar中   java Junit类无法加载基本测试类ApplicationContext   java如何在main中使用my getvalues()方法打印列表   java Sonar,S128:切换案例应该以无条件的“中断”语句结束,而不是继续   java从socket读取字符串错误连接重置错误   java使用新数据刷新任意图表饼图   java通过异步运行lambda访问方法参数   java错误的结果一旦我处理try and catch