[英]How to inherit from pre-existing class instance in Python?
我有一个 class Parent
:
class Parent:
def __init__(self, foo):
self.foo = foo
然后我有另一个 class Child
扩展Parent
。 但是我希望Child
获取一个预先存在的parent
实例并将其用作要继承的父级(而不是创建具有相同构造函数参数的Parent
的新实例)。
class Child(Parent):
def __init__(self, parent_instance):
""" Do something with parent_instance to set this as the parent instance """
def get_foo(self):
return self.foo
那么我最好能够做到:
p = Parent("bar")
c = Child(p)
print(c.get_foo()) # prints "bar"
您可以将父母的__dict__
的内容复制到孩子的。 您可以使用vars()
内置 function 来执行此操作,以及字典的update()
方法。
class Child(Parent):
def __init__(self, parent_instance):
vars(self).update(vars(parent_instance))
def get_foo(self):
return self.foo
p = Parent("bar")
c = Child(p)
print(c.get_foo())
# prints "bar"
您可以使用自己的构造函数 - 提供一个采用父级实例的类方法。
class Parent:
def __init__(self, foo):
self.foo = foo
class Child(Parent):
def get_foo(self):
return self.foo
@classmethod
def from_parent(cls, parent_instance):
return cls(parent_instance.foo)
p = Parent('bar')
c = Child.from_parent(p)
c.get_foo()
使用getattr()
从父实例中获取属性
class Parent:
def __init__(self, foo):
self.foo = foo
class Child(Parent):
def __init__(self, parent_instance):
self.parent_instance = parent_instance
def get_foo(self):
return self.foo
def __getattr__(self, attr):
return getattr(self.parent_instance, attr)
par = Parent("bar")
ch = Child(par)
print(ch.get_foo())
#prints bar
我不确定 inheritance 是否是正确的解决方案,因为它破坏了__init__
方法中的LSP 。
也许父母和孩子只是共享一个共同的界面。 我更喜欢(python3.8)之类的东西:
from typing import Protocol
class FoeAware(Protocol):
@property
def foe(self):
...
class Parent:
def __init__(self, foe):
self._foe = foe
@property
def foe(self):
return self._foe
class Child:
def __init__(self, parent: FoeAware):
self.parent = parent
@property
def foe(self):
return self.parent.foe
p = Parent("bar")
c = Child(p)
c.foe # bar
关键是它利用了通用接口FoeAware
的多态性,这比 inheritance 树更可取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.