我有以下结构:
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')
您的问题是对继承的误解。
您有一个 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()
现在 - 我对你实际想要实现的目标只有一个模糊的想法,所以不确定这是否有帮助 - 但希望解释你观察到的行为。