Python基本继承

本问题已经有最佳答案,请猛点这里访问。

我在理解Python中的继承时遇到了一些困难,但是由于我在Java方面有一些更丰富的经验,所以我知道它是如何工作的……需要说明的是,我在这里搜索了这些问题以及在线文档,所以我知道这个问题马上就会被标记为重复的问题:P

我在Codecademy上的代码是这样传递的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Car(object):
    condition ="new"
    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

    def display_car(self):
        return"This is a %s %s with %s MPG." % (self.color, self.model, self.mpg)

    def drive_car(self):
        self.condition ="used"

class ElectricCar(Car):
    def __init__(self, model, color, mpg, battery_type):
        self.model = model
        self.color = color
        self.mpg   = mpg
        self.battery_type = battery_type

但据我所知,我几乎定义了一个新类……遗产在哪里?我可以这样做:

1
2
3
4
5
6
class ElectricCar(Car):
    def __init__(self, battery_type):
        self.model = model
        self.color = color
        self.mpg   = mpg
        self.battery_type = battery_type

也许是有关键词的东西

1
super

吗?


您可以调用Car init方法并传递它的参数

1
2
3
4
class ElectricCar(Car):
    def __init__(self, model, color, mpg, battery_type):
        Car.__init__(self,model,color,mpg)
        self.battery_type = battery_type

或者您也可以使用super方法,这是注释中提到的首选方法。

1
2
3
4
class ElectricCar(Car):
    def __init__(self, model, color, mpg, battery_type):
        super(ElectricCar,self).__init__(model, color, mpg)
        self.battery_type = battery_type


如果您只是继承对象类,那么您说您实际上是在创建一个新类是正确的—它只是提供了一个基类。实际上,在python3中。X,这根本不需要。定义一个类,如下所示

1
2
class Car:
    def __init(self, ...

对象继承不用说。

你在正确的轨道上使用它。继承的真正威力在于通过定义(如:

1
2
3
class ElectricCar(Car):
    super(ElectricCar, self).__init__()
    ...

这为您提供了Car类的功能,而无需重新定义所有内容。

在这里查看关于继承的文档以获得更详细的信息。


Where is the inheritance in that?

继承在于你可以用这些类做什么:

1
2
3
4
5
6
>>> car = Car('Ford Prefect', 'white', 42)
>>> print(car.display_car())
This is a white Ford Prefect with 42 MPG.
>>> electric_car = ElectricCar('Tesla Model S', 'silver', None, 'lead-acid')
>>> print(electric_car.display_car())
This is a silver Tesla Model S with None MPG.

注意,您不必编写ElectricCar.display_car()方法。