{{1}}
我只有3次进入我的参赛作品而非6加上我很困惑如何避免歧义,因为车型和吉普车都是模特。我该如何处理它们?
答案 0 :(得分:0)
这里有两个问题:
super
。 Python无法按照您希望的方式工作。 Python中的每个实例都有一个共享的dict,所有类共享属性访问。这意味着您无法隐藏属性,只能覆盖它。要执行您想要的操作,您必须使用Car
中的模型的唯一名称和Jeep
中的唯一名称。例如。 car_model
和jeep_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