Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中覆盖uu getattribute_uuu()_Python - Fatal编程技术网

如何在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
方法我不知道如何使用复制模块。你能提供一些示例代码吗?