gpt4 book ai didi

python - 创建/模仿不可变内置类型的可变子类

转载 作者:太空宇宙 更新时间:2023-11-03 15:04:47 25 4
gpt4 key购买 nike

问题:

我已经实现了一个内部行为相当复杂的类,它伪装成一个 int 类型用于所有意图和目的。然后,作为最重要的樱桃,我真的希望我的类成功通过 isinstance() 和 issubclass() 检查 int。到目前为止我失败了。

这是我用来测试概念的一个小演示类。我试过从 objectint 继承它,虽然从 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 将经常使用基类原始值而不是我精心设计的魔术方法。不好。

我看过抽象基类,但它们似乎在做完全相反的事情:它们不是让我的类看起来像内置类型的子类,而是让类假装是某个类的父类(super class)。

使用 __new__(cls, ...) 似乎也不是解决方案。如果您只想在实际创建对象之前修改对象起始值,那很好,但我想规避不变性诅咒。尝试使用 object.__new__() 也没有结果,因为 Python 只是提示说使用 object.__new__ 来创建一个 int对象。

尝试从 (int, dict) 继承我的类并使用 dict.__new__() 也不是很成功,因为 Python 显然不允许将它们组合在一个类中。

怀疑可以通过元类找到解决方案,但到目前为止它们也没有成功,主要是因为我的大脑不够灵活,无法正确理解它们。我仍在努力,但看起来不会很快得到结果。

那么,问题是:即使我的类非常可变,是否有可能从不可变类型继承或模仿继承?只要找到解决方案(假设它存在),类继承结构对我来说并不重要。

最佳答案

这里的问题不在于不变性,而在于继承。如果 DemoClass 是 int 的子类,则为每个 DemoClass 类型的对象构造一个真正的 int 并且将直接使用而不调用 __int__ 在任何可以使用 int 的地方,只需尝试 a + 2

我宁愿在这里尝试简单地欺骗isinstance。我只是让 DemoClass 成为 object 的子类,并隐藏自定义函数后面的内置 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 - 创建/模仿不可变内置类型的可变子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34197666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com