【问题标题】:Create child class object using parent class instance使用父类实例创建子类对象
【发布时间】:2021-11-17 16:03:37
【问题描述】:

假设我们有 A 类,它有一个实例 - x。如何制作 A 类的子类,我可以将 x 作为参数传递并获取其所有参数并将其传递给子类对象。确切地说,我想做这样的事情。

class A:
    def __init__(self, parameter1, parameter2):
        self.parameter1 = parameter1
        self.parameter2 = parameter2




class B(A):
    def __init__(self, Ainstance, someParameter):
        super().__init__(**Ainstance.__dict__)
        self.someParameter = someParameter

x = A(parameter1='1', parameter2='2')

x = B(x, someParameter='3')

print(x.parameter1)
print(x.parameter2)
print(x.someParameter)

目标是创建一个类,我可以在其中获取父类对象的所有参数,并添加我自己的属性。上面代码中的问题是我无法对所有类都这样做,因为并非所有类都具有__dict__ 属性。

【问题讨论】:

  • 1.当您通过 A 实例时,您不必对所有类都这样做,只对 A 类进行吗? 2. 你为什么这样做?问一个关于如何解决那个问题的问题。这种方式大概不是吧。
  • 虽然您在技术上可以做到,但我不明白我们为什么要这样做?这背后的原因是什么?
  • 问题是没有A类,有库类。我只是想创建完全相同的对象,但具有一些附加属性。但我无法向库类添加属性。 OOP 对我来说仍然很复杂,所以我想以这种方式解决我的问题,但从表面上看,这不是合适的方式。
  • 一个库类?你的意思是你只想从中派生?
  • 不完全。我想使用库类的实例作为参数将其参数传递给子类对象。所以我将拥有完全相同的对象,以及其他属性和方法。更准确地说,我使用套接字库的套接字类。当新客户端连接时,我得到一个客户端对象并使用此客户端对象创建一个新对象,但使用用户名、与套接字关联的地址和其他属性/方法。

标签: python oop inheritance


【解决方案1】:

我有这个示例代码,我用它来提醒自己如何构造proxy

#soProxyPattern

class Example:
    def __init__(self):
        self.tag_name = 'name'
    def foo(self):
        return 'foo'
    def bar(self, param):
        return param
    
class Container:
    def __init__(self, contained):
        self.contained = contained
        self.user_name = 'username'

    def zoo(self):
        return 0
    
    def __getattr__(self, item):
        if hasattr(self.contained, item):
            return getattr(self.contained,item)
        #raise item

c = Container(Example())
print(c.zoo())
print(c.foo())
print(c.bar('BAR'))
print(c.tag_name)
print(c.user_name)

输出是:

0
foo
BAR
name
username

这表明Container 可以拥有自己的属性(方法或变量),您可以在所包含实例的所有属性之外访问这些属性(方法或变量)。

【讨论】:

  • 按我的意愿工作。这是一个很棒的概念。谢谢!
  • 不客气。如果你愿意,你可以投票赞成这个答案。
【解决方案2】:

您可以像这样使用 dir 和 getattr 而不是 dict

class A:
    def __init__(self, parameter1, parameter2):
        self.parameter1 = parameter1
        self.parameter2 = parameter2


 class B(A):
     def __init__(self, Ainstance, someParameter):
        parameters = {param: getattr(Ainstance, param) for param in dir(Ainstance) if not param.startswith("__")} 
        super().__init__(**parameters)
        self.someParameter = someParameter

更详细的解释见:Get all object attributes in Python?

【讨论】:

  • 您是否打算编辑其他答案?
  • 哦,是的,谢谢您指出
  • 感谢您的回答。它完全符合我的要求,但仍然无法解决我的问题,因为我要做的是创建实例的副本,但显然仅复制属性是不够的。
猜你喜欢
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2010-10-12
  • 2019-12-14
  • 1970-01-01
  • 2021-03-14
相关资源
最近更新 更多