子函数调用Super函数

问题描述 投票:0回答:1

我有以下结构:

class grandparent(ABC):
    @abstractmethod
    def get_obj(self):
        pass

class ParentBase(grandparent):
    def __init__(self, obj1):
        self.obj1 = obj1

    def get_obj(self,func):
        return getattr(self.obj1, func)

    def get_base_obj(self):
        return super().get_obj('base') 
  
        
class child1(ParentBase):
    def __init__(self, obj1):
        super().__init__(obj1)

    def get_obj(self):
         return super().get_base_obj().getChild1()
        

class child2(ParentBase):
    def __init__(self, obj1):
        super().__init__(obj1)

    def get_obj(self):
        return super().get_base_obj().getChild2()
        

运行此代码:


child_instance = child1(obj1)
child_instance.get_obj()

会给我错误 2 个参数输入,但 1 个预期参数,因为父级中的 get_base_obj 调用祖父母定义。

如果我将功能更改为:

def get_base_obj(self, func_name):
    return self.get_obj(func)

它将调用子类定义并且也会出错。

我希望当从子类调用 get_obj 时,父类中的 get_base_obj 也能调用父类中的 get_obj 。有没有办法做到这一点,或者我必须使parent.get_obj成为一个类函数? ParentBase 是一个基类,因此不会从那里进行初始化


编辑: 将parentBase 类更改为此似乎可行,但不是很好:

class ParentBase(grandparent):
    def __init__(self, obj1):
        self.obj1 = obj1

    def get_obj(self,func):
        return self.obj1

    def get_base_obj(self):
        return ParentBase.get_obj(self, 'base') 
python inheritance abstract-class
1个回答
0
投票

您的问题是对继承的误解。

您有一个 Parent 类和一个继承它的 Child 类。

当你这样做时

c = Child(42)
你有一个对象,而不是父对象和子对象 -
c
。在类层次结构中的任何地方,您都可以看到
self
指的是同一个对象。尝试获取某个存在于“父”
self
对象上的对象是没有意义的,因为根本不存在。
Super()
不返回父类的实例 - 它是调用父类方法的代理,并传入当前
self
作为第一个参数。

现在 - 您可以在 Class 对象上存储数据。考虑一下这个-

class Registry:
  stored_object = None

  @classmethod
  def store(cls, some_obj):
    cls.stored_object = some_obj

  def setup(self, some_obj):
    self.store(some_obj)

a = Registry()
a.store(42)
print(a.stored_object)  # 42
b = Registry()
print(b.stored_object)  # 42

如您所见,两个子对象(

Registry
类的实例)都可以访问全局单例Registry对象(这是
type
类的实例)。另一件需要考虑的事情是,您可以在一个对象中保留对另一个对象的引用,并让方法引用该对象。考虑

class Base:
  def __init__(self, value):
    self.value = value


class Child(Base):
  def __init__(self, value, parent):
    self.parent = parent
    super().__init__(value)

  def show(self):
    print(self.parent.value)

class Parent(Base):
  def spawn_child(self, child_value):
    return Child(child_value, self)

p = Parent(42)
c = p.spawn_child(22)
c.show()

现在 - 我对你实际想要实现的目标只有一个模糊的想法,所以不确定这是否有帮助 - 但希望解释你观察到的行为。

© www.soinside.com 2019 - 2024. All rights reserved.