代码之家  ›  专栏  ›  技术社区  ›  Nearoo

覆盖类会引发类型错误

  •  2
  • Nearoo  · 技术社区  · 7 年前

    问题是,他的模块在不同的地方创建了我试图扩展的类的实例。因此,我需要创建一个强制转换方法,将模块提供的基类强制转换为具有附加功能的我自己的派生类。

    class Derived(Base):
        @classmethod
        def cast(cls, obj: Base):
            obj.__class__ = cls
    

    此方法适用于我自己创建的类层次结构-但是它在我使用的模块中失败,引发以下异常:

    我很难找到关于这个例外的官方信息。任何有帮助的信息,我甚至会接受黑客的解决方案,只要它们是干净的,完全模仿我所寻找的行为。

    *我想延长的课程是 Surface pygame .

    1 回复  |  直到 4 年前
        1
  •  4
  •   Géry Ogam    4 年前

    这个 __class__

    例如 __slots__ section in the datamodel documentation 国家:

    __班级__ 只有当两个类具有相同的 __插槽__ .

    instance.__class__ attribute 只读 :

    所以呢 __班级__

    现在,在您的例子中,不允许分配,因为目标实例的类型不分配堆上的对象(进程内存的一个区域,它增长以容纳任意数量的对象,这就是 Python对象被分配)。堆上未分配的对象以不同的方式进行管理(例如,不受引用计数的影响),如果您更改了它们的类型,它们将突然需要以不同的方式进行管理。目前不支持。

    briefly supported 在python3.5版本候选构建中,允许设置 __班级__ 模块 ,但一旦发现有可能改变内部不可变值的类型,结果适得其反:

    class MyInt(int):
        # lets make ints mutable!
    
    (1).__class__ = MyInt
    

    1 interned value ,所以现在 整数的所有用法 在Python程序中无处不在 已更改。不是你想要的,尤其是如果你像googleappengine那样跨多个进程使用解释器内存的话!看到了吗 issue #24912 对于底层。

    Customising module attribute access .

    你得另辟蹊径来解决你的问题。例如,也许你的具体问题可以通过 包装 使用 __getattr__ 将属性代理到包装的实例。

    推荐文章