- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过从该类派生并覆盖/添加某些方法来扩展用 C 编写的模块类的功能*。
问题是他的模块创建了我试图在不同地方扩展的类的实例。因此,我需要创建一个转换方法,将模块提供的基类转换为我自己的具有附加功能的派生类。
这是我尝试过的:
class Derived(Base):
@classmethod
def cast(cls, obj: Base):
obj.__class__ = cls
此方法适用于我自己创建的类层次结构 - 但是它在我使用的模块中失败,抛出以下异常:
TypeError: __class__ assignment only supported for heap types or ModuleType subclasses
我很难找到有关此异常的官方信息。任何信息都有帮助,我什至会接受 hacky 解决方案,只要它们是干净的并且完全模仿我正在寻找的行为。
* 我要扩展的类是 Surface
包 pygame
内。
最佳答案
__class__
属性一直受到可接受的限制,Python 类比 C 中定义的类型灵活得多。
例如,__slots__
section in the datamodel documentation状态:
__class__
assignment works only if both classes have the same__slots__
.
并且同一个文档调用了 instance.__class__
attribute 只读:
The implementation adds a few special read-only attributes to several object types, where they are relevant.
所以 __class__
实际上并不意味着可写,但它已经存在了很长时间并且是一个非常有用的属性。
现在,在您的情况下,不允许分配,因为目标实例的类型不会在堆上分配对象(进程内存区域会增长以容纳任意数量的对象,它是大多数 Python 对象都是分配的)。未在堆上分配的对象的管理方式不同(例如,不受引用计数的影响),如果您更改了它们的类型,它们将突然需要以不同方式进行管理。目前不支持。
它是 briefly supported在 Python 3.5 候选发布版本中,允许在 modules 上设置 __class__
,但是一旦发现可以更改 interned 不可变值的类型,这就会适得其反:
class MyInt(int):
# lets make ints mutable!
(1).__class__ = MyInt
1
是一个 interned value ,所以现在 在 Python 程序中所有对整数 1
的使用 都已更改。这不是您想要的,尤其是当您像 Google App Engine 那样跨多个进程重复使用解释器内存时!参见 issue #24912低调。
但这就是异常中特别提到模块实例的原因,参见Customising module attribute access .
您必须找到其他途径来解决您的问题。例如,也许您的特定问题可以通过包装使用 __getattr__
的实例来解决将属性代理到包装的实例。
关于python - 覆盖 __class__ 引发 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52140811/
在 Python 的文档中 __class__被描述为一个属性。在对象中 type (元类),__class__似乎是一种方法。 如果我们这样做: >>> class Foo: pas
我有一系列的类,它们都继承自共享一个基类的几个可能的父类中的一个。每个类都有一个基于基类 parameters 的类作用域 Dict[str, object] parameters from copy
这个问题在这里已经有了答案: Why doesn't 2.__add__(3) work in Python? (2 个答案) 关闭 3 年前。 整数是唯一不支持.__class__操作的类型吗?例
我最近正在单步调试 CPython 源代码,特别是查看 symbol table entry编译期间的一个类。 我遇到了 typedef struct _symtable_entry 的以下条目结构:
我想测试一个对象是否是一个类的实例,并且只有这个类(没有子类)。我可以这样做: obj.__class__ == Foo obj.__class__ is Foo type(obj) == Foo t
有以下服务器代码(我正在定义一个继承自套接字的类,并尝试使用该类调用客户端套接字上的发送方法): import socket class LogSocket(socket.socket): d
python 依赖于 cell 中的 __class__ 变量来进行 super() 调用。它从第一个堆栈帧中的free 变量获取此单元格。 奇怪的是,这个变量不在 locals() 中,而是在您从
我对设置对象的属性和在对象的 __class__ 属性上设置属性之间的区别感到有点困惑。粗略地说,obj.attr 与 obj.__class__.attr。它们有什么区别? 前者是在一个实例上设置一
在 pinax Userdict.py 中: def __getitem__(self, key): if key in self.data: return s
这个问题在这里已经有了答案: How to avoid infinite recursion with super()? (1 个回答) 关闭 5 年前。 我在 WTForms 中处理继承。我有下一
Django 源代码: def new_method_proxy(func): def inner(self, *args): if self._wrapped is empt
使用 __class__ 在类中创建新实例是个好主意吗? 以下代码是执行此操作的示例: from collections import namedtuple _Position = namedtupl
我希望能够做到: >>> class a(str): ... pass ... >>> b = a() >>> b.__class__ = str Traceback (most recent
我有一个关于 python 中的 __class__ 的问题。 文档说 __class__ 是类实例所属的类。于是我进行了一系列的实验: class counter: count = 0
也许这是一个微不足道的问题。在 python 下,为什么 self.__class__.__bases__ 没有回溯到 object?我的只显示了类(class)之上的单亲 parent 的元组。 最
我创建了这样的类来解决签名和 feature_names 的问题: import copy from sklearn.feature_selection import VarianceTreshold
我已阅读 Why is Python 3.x's super() magic?并了解在方法中使用 super 或 __class__ 会自动为该方法创建一个 __class__ 单元格变量: clas
我需要从类中获取类名: class Cls: notation = None def __init__(self): notation = self.__class__
我试图通过从该类派生并覆盖/添加某些方法来扩展用 C 编写的模块类的功能*。 问题是他的模块创建了我试图在不同地方扩展的类的实例。因此,我需要创建一个转换方法,将模块提供的基类转换为我自己的具有附加功
class Foo: pass >>> f = test.Foo() 让我们看看类实例...... >>> dir(f) ['__add__', [__class__] ...] 哦哦!让我们看看
我是一名优秀的程序员,十分优秀!