为什么我的孩子班不适合多个父班?

时间:2016-04-12 10:45:43

标签: python class

{{1}}

我只有3次进入我的参赛作品而非6加上我很困惑如何避免歧义,因为车型和吉普车都是模特。我该如何处理它们?

1 个答案:

答案 0 :(得分:0)

这里有两个问题:

  • Python对象有一个用于存储属性的dict,不像其他编程语言那样隐藏任何属性
  • 您错误地使用了多重继承和super

Python无法按照您希望的方式工作。 Python中的每个实例都有一个共享的dict,所有类共享属性访问。这意味着您无法隐藏属性,只能覆盖它。要执行您想要的操作,您必须使用Car中的模型的唯一名称和Jeep中的唯一名称。例如。 car_modeljeep_model。快速测试显示:

class Parent(object):
    def __init__(self):
        super(Parent, self).__init__()
        self.value = "parent"
    def parent_value(self):
        return self.value

class Child(Parent):
    def __init__(self):
        super(Child, self).__init__()
        self.value = "child"
    def child_value(self):
        return self.value

p = Parent()
assert p.parent_value() == "parent"
c = Child()
assert c.child_value() == "child"
assert c.parent_value() == "child"

您可以使用"私人"变量。这些并不是非常私密的,python只是做一些名为mangling的东西,使它们更难以意外覆盖。

class Parent(object):
    def __init__(self):
        super(Parent, self).__init__()
        self.__value = "parent"
    def parent_value(self):
        return self.__value

class Child(Parent):
    def __init__(self):
        super(Child, self).__init__()
        self.__value = "child"
    def child_value(self):
        return self.__value

p = Parent()
assert p.parent_value() == "parent"
c = Child()
assert c.child_value() == "child"
assert c.parent_value() == "parent"
print(vars(c)) 
# prints {'_Child__value': 'child', '_Parent__value': 'parent'}
c._Parent__value = "new value"
assert c.parent_value() == "new value"

最后,基类中的__init__方法不会调用super。在非多重继承中,这对于基类不是必需的。但是,在您的情况下(使用多重继承),__init__方法集将转到Car.__init__,然后在不调用Jeep.__init__的情况下停止。

class Car(object):
    def __init__(self):
        print("init car")
        super(Car, self).__init__()
        print("assigning car")
        self.car = "car"

class Jeep(object):
    def __init__(self):
        print("init jeep")
        super(Jeep, self).__init__()
        print("assigning jeep")
        self.jeep = "jeep"

class ElectricCar(Car, Jeep):
    def __init__(self):
        print("init electric car")
        super(ElectricCar, self).__init__()
        print("assigning electric")
        self.electric = "electric"

car = ElectricCar()
# prints the following:
# init electric car
# init car
# init jeep
# assigning jeep
# assigning car
# assigning electric