22

在此代码示例中,如何从“child”访问“myvar”:

class Parent():
    def __init__(self):
        self.myvar = 1

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)

        # this won't work
        Parent.myvar

child = Child()
4

4 回答 4

29

Parent是一个类-蓝图不是它的实例,在OOPS中访问对象的属性它需要相同的实例,这里self / child是实例,而Parent / Child是类...

看看下面的答案,或许能解开你的疑惑。

class Parent():
    def __init__(self):
        self.myvar = 1

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)

        # here you can access myvar like below.
        print self.myvar

child = Child()
print child.myvar
于 2012-06-06T06:18:45.530 回答
9

Parent 没有名为 myvar 的属性。只有parent 的实例具有该属性。在 Child 的方法中,您可以使用 访问该属性self.myvar

于 2012-06-06T06:17:55.757 回答
2

替代使用继承

当前的答案来自继承的角度,但这并不总是您想要的——有时您可能希望子对象是与父对象完全不同类型的对象,但仍然可以访问父属性。

对于业务类比,请考虑具有 Worksheet 子级的 Excel 工作簿,它们本身具有 Range 子级,等等。

唯一的孩子

另一种方法(不是唯一的方法)是将父级作为参数传递给子级,以创建与父级对应的属性:

class Parent(object):
    def __init__(self, parent_value):
        self.parent_value = parent_value
        self.child = Child(self)


class Child(object):
    def __init__(self, _parent):
        self.parent = _parent
        self.child_value = 0


new_parent = Parent(1)
print(new_parent.parent_value)        # prints 1

new_child = new_parent.child
print(new_child.child_value)          # prints 0
print(new_child.parent.parent_value)  # prints 1

new_parent.parent_value = 100
print(new_child.parent.parent_value)  # prints 100

请注意,这与实例化child的相同new_parent。要访问父级的属性,只需通过parent属性。

多个孩子

您可以扩展它,以便您可以Child通过new_parent对象创建类的多个实例。下面的代码是执行此操作的一种简单方法,它将child属性替换为children属性和add_child方法。

class Parent(object):
    def __init__(self, parent_value):
        self.parent_value = parent_value
        self.children = []

    def add_child(self, child_value):
        new_child = Child(child_value, _parent=self)
        self.children.append(new_child)
        return new_child  # allows add_child to assign a variable


class Child(object):
    def __init__(self, child_value, _parent):
        self.parent = _parent
        self.child_value = child_value


new_parent = Parent(1)

# add 3 Child instances with child_values 2, 4, 8
[new_parent.add_child(v) for v in [2, 4, 8]]

# add another child that utilises the return statement
extra_child = new_parent.add_child(16)

for child in new_parent.children:
    print(child.child_value)          # prints 2, 4, 8, 16
    print(child.parent.parent_value)  # prints 1

new_parent.parent_value = 32
for child in new_parent.children:
    print(child.parent.parent_value)  # prints 32

# prove that extra_child is new_parent.children[3]
extra_child.child_value = 64
print(new_parent.children[3].child_value)  # prints 64
于 2021-04-17T13:28:28.680 回答
-2

您需要首先使用命令“super”通过所谓的代理对象启动父类。

所以代码将是这样的:

class Parent():
  def __init__(self):
      self.myvar = 1

class Child(Parent):
  def __init__(self):
      super.__init__()


child = Child()
print child.myvar
于 2019-04-21T10:21:57.040 回答