python-创建/模仿不可变内置类型的可变子类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-创建/模仿不可变内置类型的可变子类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2560字,纯文字阅读大概需要4分钟。
内容图文
![python-创建/模仿不可变内置类型的可变子类](/upload/InfoBanner/zyjiaocheng/682/e08999ff0d374ae790ed447b29da4276.jpg)
问题:
我实现了一个具有相当复杂的内部行为的类,该类出于所有意图和目的都伪装成int类型.然后,作为最重要的角色,我真的希望我的类成功通过isinstance()和issubclass()检查int.到目前为止,我失败了.
这是我用来测试概念的一个小型演示类.我试过从object和int继承它,而从int继承使它通过检查,这也破坏了它的某些行为:
#class DemoClass(int):
class DemoClass(object):
_value = 0
def __init__(self, value = 0):
print 'init() called'
self._value = value
def __int__(self):
print 'int() called'
return self._value + 2
def __index__(self):
print 'index() called'
return self._value + 2
def __str__(self):
print 'str() called'
return str(self._value + 2)
def __repr__(self):
print 'repr() called'
return '%s(%d)' % (type(self).__name__, self._value)
# overrides for other magic methods skipped as irrelevant
a = DemoClass(3)
print a # uses __str__() in both cases
print int(a) # uses __int__() in both cases
print '%d' % a # __int__() is only called when inheriting from object
rng = range(10)
print rng[a] # __index__() is only called when inheriting from object
print isinstance(a, int)
print issubclass(DemoClass, int)
从本质上讲,从一个不可变的类继承会导致一个不可变的类,Python通常会使用基类的原始值,而不是我精心设计的魔术方法.不好.
我看过抽象基类,但是它们似乎在做完全相反的事情:不是使我的类看起来像内置类型的子类,而是使它们假装为一个超类.
使用__new __(cls,…)似乎也不是解决方案.如果您只想在实际创建对象之前修改对象的初始值,那就很好了,但我想逃避不变性的诅咒.尝试使用object .__ new __()也没有结果,因为Python只是抱怨说使用object .__ new__创建int对象并不安全.
尝试从(int,dict)继承我的类并使用dict .__ new __()也不是很成功,因为Python显然不允许将它们组合到单个类中.
我怀疑可以用元类找到解决方案,但是到目前为止,它们也都没有成功,主要是因为我的大脑根本没有足够的能力去正确地理解它们.我仍在尝试,但看起来不会很快得到结果.
因此,问题来了:即使我的类非常易变,仍然可以继承或模仿不可变类型的继承吗?只要找到解决方案(假设它完全存在),类继承结构对我来说并不重要.
解决方法:
这里的问题不是不变性,而仅仅是继承.如果DemoClass是int的子类,则为每个类型为DemoClass的对象构造一个真正的int,将直接使用它,而无需在可能使用int的任何地方调用__int__,只需尝试2.
我宁愿在这里简单地欺骗isinstance.我只是将DemoClass作为对象的子类,并将内置的isinstance隐藏在自定义函数的后面:
class DemoClass(object):
...
def isinstance(obj, cls):
if __builtins__.isinstance(obj, DemoClass) and issubclass(int, cls):
return True
else:
return __builtins__.isinstance(obj, cls)
然后,我可以这样做:
>>> a = DemoClass(3)
init() called
>>> isinstance("abc", str)
True
>>> isinstance(a, DemoClass)
True
>>> isinstance(a, int)
True
>>> issubclass(DemoClass, int)
False
内容总结
以上是互联网集市为您收集整理的python-创建/模仿不可变内置类型的可变子类全部内容,希望文章能够帮你解决python-创建/模仿不可变内置类型的可变子类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。