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

2024-06-08 14:56:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想实现以下目标:

#!/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"

我需要一个接一个地复制属性还是有更好的方法?在


Tags: nameself目标binusrdefshclass
2条回答

我更喜欢显式的解决方案-一个一个地复制。Martijn Pieters的解决方案很好,但是随着时间的推移,你的{}可能会增长,你可能不想复制它的所有内容(或者更糟的是,忘记这个事实,体验一些讨厌的副作用)。除了Python的禅说:Explicit is better than implicit.

旁注-你知道财产,对吗?因此,如果使用它们,代码可能更像Python:

class SuperHero(object):
    @property
    def name(self):
        return self._name
    @name.setter
    def name(self, name):
        self._name = name

sh = SuperHero()
sh.name = "Clark Kent" 

添加跨__dict__属性进行复制的启动器函数:

class SuperMan(SuperHero): 
    def __init__(self, source=None):
        if source is not None:
            self.__dict__.update(source.__dict__)

一个实例的__dict__包含所有实例属性,上面的只是将所有这些属性复制到新的SuperMan实例中。

演示:

^{pr2}$

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

sh = SuperHero()
sh.setName("Clark Kent")
sh.__class__ = SuperMan

但这可能会导致更有趣的错误,因为您从未调用SuperMan初始值设定项,因此预期状态可能不正确。

相关问题 更多 >