python – 使isinstance(obj,cls)与装饰类一起工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 使isinstance(obj,cls)与装饰类一起工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1459字,纯文字阅读大概需要3分钟。
内容图文
![python – 使isinstance(obj,cls)与装饰类一起工作](/upload/InfoBanner/zyjiaocheng/818/9626d7a4e0e24ed598256e755a39d240.jpg)
我有几个类需要执行以下操作:
调用构造函数时,如果已存在相等的对象(也称为具有相同id的对象),则返回该对象.否则,创建一个新实例.
基本上,
>>> cls(id=1) is cls(id=1)
True
为此,我编写了一个类装饰器,如下所示:
class Singleton(object):
def __init__(self, cls):
self.__dict__.update({'instances': {},
'cls': cls})
def __call__(self, id, *args, **kwargs):
try:
return self.instances[id]
except KeyError:
instance= self.cls(id, *args, **kwargs)
self.instances[id]= instance
return instance
def __getattr__(self, attr):
return getattr(self.cls, attr)
def __setattr__(self, attr, value):
setattr(self.cls, attr, value)
这样做我想要的,但是:
@Singleton
class c(object):
def __init__(self, id):
self.id= id
o= c(1)
isinstance(o, c) # returns False
我怎样才能解决这个问题?我找到了related question,但我似乎无法将这些解决方案改编为我的用例.
我知道有人要我发布一些不起作用的代码,所以你去了:
def Singleton(cls):
instances= {}
class single(cls):
def __new__(self, id, *args, **kwargs):
try:
return instances[id]
except KeyError:
instance= cls(id, *args, **kwargs)
instances[id]= instance
return instance
return single
# problem: isinstance(c(1), c) -> False
def Singleton(cls):
instances= {}
def call(id, *args, **kwargs):
try:
return instances[id]
except KeyError:
instance= cls(id, *args, **kwargs)
instances[id]= instance
return instance
return call
# problem: isinstance(c(1), c) -> TypeError
解决方法:
您可以在装饰器类中添加自定义__instancecheck__挂钩:
def __instancecheck__(self, other):
return isinstance(other, self.cls)
内容总结
以上是互联网集市为您收集整理的python – 使isinstance(obj,cls)与装饰类一起工作全部内容,希望文章能够帮你解决python – 使isinstance(obj,cls)与装饰类一起工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。