【问题标题】:Creating an object with an instance of its parent class使用其父类的实例创建对象
【发布时间】:2021-10-08 18:53:18
【问题描述】:

假设我有一个类A 包含一些基本属性,即

class A: 
    def __init__(self,name,value,):
        self.name = name
        self.value = value

我想创建一个子类B,它具有A 的所有属性,但还包括其他方法,例如

class B(A):
    def __init__(self,instance_of_A):
        # ???        
    def add_to_value(self,x):
        return self.value + x

最终,我想做类似的事情

a = A('my_name',3)
b = B(a)
c = b.add_to_value(2) # c is 5
print(b.name) # should print 'my_name'

有没有办法在创建b 时不显式获取a 的每个属性并将其提供给b 的方法?

【问题讨论】:

  • 这能回答你的问题吗? How to invoke the super constructor in Python?
  • 请从Simple python inheritance开始阅读更多关于继承的信息。
  • 如果它是一个非插槽类,你可以做类似vars(self).update(vars(instance_of_A)) 的事情
  • 为什么要使用现有的A 实例来创建B?为什么不直接编写构造函数,让它接收相同的信息,然后调用super? (或者如果没有额外的构造工作要做,就跳过__init__,从而使用基础构造函数?)
  • 谢谢@juanpa.arrivillaga,这就是我要找的。我将使用它和[setattr(self, method, getattr(a,method)) for method in methods]methods = [attr for attr in dir(a) if callable(getattr(a, attr)) and attr.startswith('__') is False] 来给b 提供a 的方法。

标签: python


【解决方案1】:

您将B__init__() 函数保留为空,这可能会出错。要保持它为空,请在其中写一个pass 语句。如果要保留它,那么B__init__() 也必须有A 的参数,以便在调用时将这些值转发给A。如果你想保持它为空,最好不要写它,当B 的对象被创建时,将直接调用A__init__()。在创建B的对象时,不需要写B(a),直接传递A的参数就可以得到想要的输出。

b = B('my_name', 3)
c = b.add_to_value(2) # c is 5

【讨论】:

    【解决方案2】:

    这就是我的处理方式:

    class B(A):
        def __init__(self, name, value, extra_attribute_only_for_B):
            super().__init__(name, value) # Initializes attributes of base class
            self.extra_var = extra_attribute_only_for_B # Can give B more attributes
    
        def add_to_value(self,x):
            return self.value + x
    
    b = B('my_name',3)
    c = b.add_to_value(2)
    print(b.name)
    print(c)
    

    输出:

    my_name
    5
    

    由于BA 的子类,你可以调用A__init__() 来初始化继承的属性,并且还给B 更多A 没有的新属性(我已经包括一个例子)

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2019-07-28
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      相关资源
      最近更新 更多