[英]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.