繁体   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