Python 2.7多重继承

问题描述 投票:2回答:1

为什么这个简单的代码不适用于Python 2.7?请帮忙。我最有可能在课堂上误用“新风格”中的super方法。

class Mechanism(object):
    def __init__(self):
        print('Init Mechanism')
        self.__mechanism = 'this is mechanism'

    def get_mechanism(self):
        return self.__mechanism

class Vehicle(object):
    def __init__(self):
        print('Init Vehicle')
        self.__vehicle = 'this is vehicle'

    def get_vehicle(self):
        return self.__vehicle

class Car(Mechanism, Vehicle):
    def __init__(self):
        super(Car, self).__init__()

c = Car()
print(c.get_mechanism())
print(c.get_vehicle())

错误:

Init Vehicle
Traceback (most recent call last):
  File "check_inheritance.py", line 22, in <module>
    print(c.get_mechanism())
  File "check_inheritance.py", line 7, in get_mechanism
    return self.__mechanism
AttributeError: 'Car' object has no attribute '_Mechanism__mechanism'

编辑

  1. 将qazxsw poi中的qazxsw poi修复为qazxsw poi
  2. 正确的答案是在所有类中使用def __init(self):方法。不仅在Mechanism类。看看def __init__(self):的答案
  3. 尽量避免使用双下划线super作为私有变量。它不是Python方式(代码样式)。 Car
python python-2.7 inheritance multiple-inheritance
1个回答
2
投票

你有2个问题:

以下代码有效:

__init__

演示:

super(...).__init__()

您可能也应该不使用双下划线名称。有关详细信息,请参阅__init__,但简短的原因是您没有此类用于类 - 私有名称的用例,因为您没有构建旨在由第三方扩展的框架;这是这些名字的唯一真正用途。

坚持使用单下划线名称,所以class Mechanism(object): def __init__(self): super(Mechanism, self).__init__() print('Init Mechanism') self.__mechanism = 'this is mechanism' def get_mechanism(self): return self.__mechanism class Vehicle(object): def __init__(self): super(Vehicle, self).__init__() print('Init Vehicle') self.__vehicle = 'this is vehicle' def get_vehicle(self): return self.__vehicle class Car(Mechanism, Vehicle): def __init__(self): super(Car, self).__init__() >>> c = Car() Init Vehicle Init Mechanism >>> print(c.get_mechanism()) this is mechanism >>> print(c.get_vehicle()) this is vehicle

© www.soinside.com 2019 - 2024. All rights reserved.