python-类-从入门到精通(二)

0.本文内容--继承

在上一篇博客中,讲述了python3类的基本使用方法,本篇博客着重介绍类的继承特性。

在编写类的时候,我们不一定都要从空白开始。如果我们正在编写的类,实际上是另外一个已经存在的类的特殊版本,那么我们就可以使用类的继承。B类继承A类后,B类将自动获取A类的所有属性和方法,A类称为父类,B类称为子类。子类及继承了父类的所有属性和方法,同时还可以定义自己的属性和方法。

而继承的实现也很简单,只要在定义子类的时候,将父类的名称放到子类名称后面的括号中即可:

比如,已经定义一个父类为Car(),需要新定义一个子类为ElectricCar()

class ElectricCar(Car):

1.子类__init__()方法

子类继承父类的所有属性和方法。既然拥有了使用的权利,那也必须承担起初始化的责任!如何初始化父类的属性呢?

这里需要用到super.__init__()方法。父类也成为超类(superclass),这也是super名称的由来。

例如,

class Car():
    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
class ElectricCar(Car):
    def __init__(self,make,model,year):
        super().__init__(make,model,year)

在python2.7中,继承的方式与python3中略有差别,这里稍作介绍:

class Car(object):
    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
class ElectricCar(Car):
    def __init__(self,make,model,year):
        super(ElectriCar,self).__init__(make,model,year)

python2.7中使用继承时候,需要在super()函数中传入两个实参,子类名和对象self。

另外,在父类中需要指定object。

2.定义子类属性和方法

子类继承了父类之后,可以添加新的属性和方法。

class Car():
    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

class ElectricCar(Car):
    def __init__(self,make,model,year):
        super().__init__(make,model,year)
        self.battery_size = 70

    def describe_battery(self):
        print("This car has a " + str(self.battery_size) + '-kwh battery')

父类的属性和方法一般不能完全满足子类的需求,否则就不需要新建新的子类了。

继承只是在一定程度上减少了编程的负担。因此,我们需要在子类中添加我们仍然缺少的方法。

比如新的子类ElectricCar添加了电池容量这一属性,并使用describe_battery方法,打印出电池容量。

3.重写父类方法

class ElectricCar(Car):
        
    def fill_gas_tank(self):
        print("This car doesn't need a gas tank")

我们的ElectricCar类虽然继承了Car类,但ElectricCar没有油箱,把这个方法放在ElectricCar中,这是不合理的。

那么我们可以通过重写方法,如果有用户在ElectricCar中调用了fill_gas_tank这个方法,我们给予提示。

4.实例作属性

类中的属性既可以是变量,也可以是一个类的实例。

比如,电池这个属性可能很多类都会用到,那么我们为什么不把battery单独写成一个类呢?

class Battery():
    def __init__(self,battery_size=70):
        self.battery_size = battery_size

    def describe_battery(self):
        print("This car has a "+ str(self.battery_size) + "-kwh battery")

class ElectricCar(Car):
    def __init__(self,make,model,year):
        super().__init__(make,model,year)
        self.battery = Battery()

my_tesla = ElectricCar('tesla','model s',2018)
my_tesla.battery.describe_battery()

这里需要注意,ElectricCar类与Battery类并不是继承关系,所以也不会有super().__init__()函数的存在。

当Python运行到ElectricCar类中的self.battery = Battery()时,会自动创建Battery()实例。所以,在程序中我们并没有创建Battery()类的实例,但是却可以直接访问到my_tesla.battery属性。

在实际应用中,随着我们项目的推进,我们会不断地给类添加各种细节。当我们的类过于臃肿的时候,我们可以把比较复杂的部分拆分出来,写成多个协同工作的小类。

猜你喜欢

转载自blog.csdn.net/qq_17753903/article/details/82974349