【发布时间】:2021-05-24 12:27:29
【问题描述】:
请解释为什么我不能使用super(class, self) 来访问在类继承层次结构中较高的类中定义的属性,以及如何访问它们。
根据文档,super(class, self 应该返回一个代理对象,通过它我可以访问父类实例中的def name()。
返回一个代理对象,它将方法调用委托给父对象或 类型的兄弟类。这对于访问继承的方法很有用 已在类中被覆盖。
对象或类型决定方法解析顺序 搜索。搜索从类型之后的类开始。
例如,如果 mro 的 object-or-type 是 D -> B -> C -> A -> object 且 type 的值为 B,则 super() 搜索 C -> A -> 对象。
我认为super(Parent) 会给具有def name() 的GrandParent 对象提供代理。
class GrandParent:
def __init__(self):
self._name = "grand parent"
@property
def name(self):
return self._name
class Parent(GrandParent):
def __init__(self):
super().__init__()
self._name = "parent"
@property
def name(self):
return super().name
class Child(Parent):
def __init__(self):
super().__init__()
self._name = "child"
@property
def name(self):
return super(Parent).name
print(Child().name)
---
AttributeError: 'super' object has no attribute 'name'
没有(class, self),它返回...子属性。显然我还没有理解 self 和 super 在 Python 中是如何工作的。请建议要研究哪些资源以充分了解行为和设计。
class GrandParent:
def __init__(self):
self._name = "grand parent"
@property
def name(self):
return self._name
class Parent(GrandParent):
def __init__(self):
super().__init__()
self._name = "parent"
@property
def name(self):
return super().name
class Child(Parent):
def __init__(self):
super().__init__()
self._name = "child"
@property
def name(self):
return super().name
print(Child().name)
---
child
【问题讨论】:
-
没有“超级名称”。所有
name属性只返回self._name,其中只有一个。您的对象的每个父对象都没有一个_name属性。