如何在Python中覆盖uu getattribute_uuu()
我正试图为一个实例修改如何在Python中覆盖uu getattribute_uuu(),python,Python,我正试图为一个实例修改\uuuuuuu getattribute\uuuuuuuuuuuu()方法,您可能已经知道,\uuuuuuuuu getattirbute\uuuuuuuuuuu>在Python中是只读属性(编辑:显然,对于某些对象是,而对于其他对象则不是)。我想的是,创建一个新对象,如下所示: def create_new_instace(old_instance): class temp(old_instance.__class__): def __init_
\uuuuuuu getattribute\uuuuuuuuuuuu()
方法,您可能已经知道,\uuuuuuuuu getattirbute\uuuuuuuuuuu>在Python中是只读属性(编辑:显然,对于某些对象是,而对于其他对象则不是)。我想的是,创建一个新对象,如下所示:
def create_new_instace(old_instance):
class temp(old_instance.__class__):
def __init__(self,*args,**kwargs):
"Since we will copy an already inited instance"
pass
def __getattribute__(self,attr):
# do stuff
new_instance = temp()
# magically copy all attrs of old_instance to new_instance
return new_instance
这可能吗?我没有特别的问题,我只是想知道如何做到这一点。对于Python 2.2+来说是可能的,按照您尝试的方式,请阅读此处(搜索getattirbute),了解您应该考虑的具体事项:
实际上,是的。检查\uuuuu getattribute\uuuu
和\uuuuuu getattr\uuuuu
方法之间的差异
您可以将新值分配给实例的字段\uuuu getattribute\uuuu
,除非\uuu setattr\uuuu
明确禁止这样做。在python提示符中尝试以下操作:
>>>class A(object):
>>> pass
>>>A().__getattribute__ = myFunc
>>>A().__getattr__ = myFunc
如果\uuuuu setattr\uuuuuu
不允许您这样做,您必须执行类似于您提出的解决方案的操作。检查模块copy
中的“神奇复制”属性。我不确定我是否理解您的目标。如果您只是想创建一个与另一个对象重复的新对象,可以使用
from copy import copy
new_instance = copy( old_instance )
这将创建一个浅拷贝。还有copy.deepcopy
用于对象的深度复制
如果希望派生类具有另一个实例属性的副本(可能是由于某些原因需要动态创建的其他自定义项),可以使用:
from copy import copy
def create_new_instance( old_instance ):
class NewClass( old_instance.__class__ ):
"""
dynamic custom class
"""
# ... customizations
new_instance = copy( old_instance )
new_instance.__class__ = NewClass
这不适用于某些系统类类型,\uuuu class\uuu
不可分配。(例如,我认为列表、元组、str)
在这些情况下,您可以使用\uuuuu new\uuuuu
定义派生类。。。但我不确定是否有一种“标准”的方法来定义参数——你可能会被简化为处理案例
请注意,除非您有其他动态创建新类的原因,否则无需在函数中定义它。如果您告诉我们更多关于您遇到的问题以及系统的更大目标,您可能会得到更详细的帮助。属性的可读性取决于\uuuuu setattribute\uuuu
方法我不知道如何使用复制模块。你能提供一些示例代码吗?