簡體   English   中英

如何從 Python 中已有的 class 實例繼承?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM