【问题标题】:How to access parent class instance attribute from child class instance?如何从子类实例访问父类实例属性?
【发布时间】:2021-11-07 07:14:34
【问题描述】:

在这个例子中如何访问Parent的名字?

class Parent:
    def __init__(self) :
        self.name = "toto"
        self.enfant = self.Child()

    class Child:
        def __init__(self) :
            self.child_name="tata"

        def affiche(self):
            print(?? Parent.name) # how to display the parent's name ?

【问题讨论】:

  • 你真的不能。这不是 Java。你最好在全局命名空间中定义Child,因为它无论如何都看不到Parent
  • 好的,我想知道为什么我假设 Child 继承自 Parent :)
  • ParentChild 类之间没有任何关系,除了后者位于前者的命名空间中——这就是为什么 @Mad Physicist 的评论是正确的。
  • 我认为你的问题是在暗示继承,如果是这样,你的类结构是错误的。有了它的结构,Child 只是 Child 类型的另一个变量。如果您将它作为名为 child: str 的类变量,它是字符串类型的子变量,则没有什么不同。如果通过继承,那么是的,您可以获得父母的姓名。

标签: python python-3.x class parent


【解决方案1】:

你不能像在 Java 中那样做。 Python 中的嵌套类是完全独立的对象。他们生活在不知道他们的父母的情况下,事实上,当类体被执行时,他们看不到他们的父母。

解决您的问题的方法是在子级中引用父级(另外,不要打扰嵌套类):

class Child:
    def __init__(self, parent):
        self.child_name = "tata"
        self.parent = parent
        
    def affiche(self):
        print(self.parent.name)

class Parent:
    def __init__(self) :
        self.name = "toto"
        self.enfants = [Child()]

如果您要将Child 嵌套到Parent 中,您仍然可以用同样的方式编写它,并将构造函数调用为self.Child(self)


您可能需要查看以下问题以获取更多信息:

【讨论】:

    【解决方案2】:

    正如我在comment 中所说,除了一个类的定义嵌套在另一个类的命名空间中之外,您的两个类之间没有特殊关系。为了做你想做的事,你需要明确地“告诉”Child 类它的父类是谁,方法是在构造一个实例时将其作为参数传递 - 如果它需要显式保存该值以后想在affiche()等其他方法中使用它。

    这就是我的意思:

    class Parent:
        def __init__(self) :
            self.name = "toto"
            self.enfant = self.Child(self)  # Pass self as parent argument.
    
        class Child:
            def __init__(self, parent):
                self.parent = parent  # Remember parent.
                self.child_name="tata"
    
            def affiche(self):
                print(self.parent.name) # Display the parent's name.
    
    
    parent = Parent()
    parent.enfant.affiche()  # -> toto
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      相关资源
      最近更新 更多