Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何使用super(<;class>;,self)访问父类中的实例属性?_Python_Class_Super - Fatal编程技术网

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()

返回代理对象,该代理对象将方法调用委托给父对象或 类型的同级类。这对于访问继承的方法很有用 已在类中重写的

对象或类型决定要执行的方法解析顺序 搜索。搜索从类型后面的类开始

例如,如果对象或类型的mroD->B->C->A-> 对象,类型的值为B,然后super()搜索C->A-> 反对

我认为
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'}