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)
我是否必须逐个复制属性或者有更好的方法吗?
添加在__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初始化程序,因此预期状态可能不正确.
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |