Python:如何将所有属性从基类复制到派生类

Jür*_*ger 2 python inheritance class

我想实现以下目标:

#!/usr/bin/python
class SuperHero(object): 
    def setName(self, name):
        self.name = name
    def getName(self):
        return self.name

class SuperMan(SuperHero): 
    pass

if __name__ == "__main__":
    sh = SuperHero()
    sh.setName("Clark Kent")
    sm = SuperMan(sh)  # This does *not* work in real python
    print sm.getName() # prints "Clark Kent"
Run Code Online (Sandbox Code Playgroud)

我是否必须逐个复制属性或者有更好的方法吗?

Mar*_*ers 6

添加在__dict__属性中复制的启动器功能:

class SuperMan(SuperHero): 
    def __init__(self, source=None):
        if source is not None:
            self.__dict__.update(source.__dict__)
Run Code Online (Sandbox Code Playgroud)

__dict__实例的包含所有实例的属性,上面只是抄袭了所有这些属性为新的SuperMan实例.

演示:

>>> class SuperHero(object): 
...     def setName(self, name):
...         self.name = name
...     def getName(self):
...         return self.name
... 
>>> class SuperMan(SuperHero): 
...     def __init__(self, source=None):
...         if source is not None:
...             self.__dict__.update(source.__dict__)
... 
>>> sh = SuperHero()
>>> sh.setName("Clark Kent")
>>> sm = SuperMan(sh)
>>> print sm.getName() 
Clark Kent
Run Code Online (Sandbox Code Playgroud)

或者,对于更糟糕的黑客攻击,您可以替换class属性:

sh = SuperHero()
sh.setName("Clark Kent")
sh.__class__ = SuperMan
Run Code Online (Sandbox Code Playgroud)

但是这可能会导致更有趣的错误,因为您从未调用过SuperMan初始化程序,因此预期状态可能不正确.