Python-如何使用super(<;class>;,self)访问父类中的实例属性?
请解释为什么我不能使用Python-如何使用super(<;class>;,self)访问父类中的实例属性?,python,class,super,Python,Class,Super,请解释为什么我不能使用super(class,self)访问类继承层次结构中较高级别的类中定义的属性,以及如何访问它们 根据文档,super(class,self应该返回一个代理对象,通过它我可以访问父类实例中的def name() 返回代理对象,该代理对象将方法调用委托给父对象或 类型的同级类。这对于访问继承的方法很有用 已在类中重写的 对象或类型决定要执行的方法解析顺序 搜索。搜索从类型后面的类开始 例如,如果对象或类型的mroD->B->C->A-> 对象,类型的值为B,然后supe
super(class,self)
访问类继承层次结构中较高级别的类中定义的属性,以及如何访问它们
根据文档,super(class,self
应该返回一个代理对象,通过它我可以访问父类实例中的def name()
super(Parent)
将为祖父母对象提供一个代理,该对象具有def 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
self
始终引用同一个对象,父对象的\uuuuuu init\uuuuu
中的自我
是您的子对象祖父母的实例。
只是在该对象上设置一个属性。通过链接所有这些\uuuuuu init\uuuu
,您实际上就是这样做的:
o = object()
o._name = 'grand parent'
o._name = 'parent'
o._name = 'child'
您只是覆盖了\u name
属性,该属性只有一个。所有不同的@属性只返回这个\u name
属性的值,您的对象只有一个属性,其值是'child'
如果希望对象每个父对象都有一个单独的\u name
属性,那么实际上必须创建单独的属性。最简单的方法可能是使用Python的双下划线a.k.a.“私有属性”:
实际的属性被命名为\u A\u\u foo
和\u B\u foo
,因此不会相互冲突。没有“超级名称”。所有名称
属性只返回自身。\u名称
,其中只有一个属性。对象的每个父对象没有一个\u名称
属性。
o = object()
o._name = 'grand parent'
o._name = 'parent'
o._name = 'child'
>>> class A:
... def __init__(self):
... self.__foo = 'bar'
... @property
... def foo(self):
... return self.__foo
...
>>> class B(A):
... def __init__(self):
... super().__init__()
... self.__foo = 'baz'
... @property
... def foo(self):
... return super().foo
...
>>> B().foo
'bar'
>>> vars(B())
{'_A__foo': 'bar', '_B__foo': 'baz'}