《Python 编程从入门到实践》———— 继承

 编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
 创建子类的实例时,Python 首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__()需要父类施以援手。创建子类时,父类必须包含在当前文件中,且位于子类前面。例如:我们定义了子类 ElectricCar。定义子类时,必须在括号内指定父类的名称。方法__init__()接受创建 Car 实例所需的信息。super() 是一个特殊函数,帮助 Python 将父类和子类关联起来。这行代码让 Python 调用 ElectricCar 的父类的方法__init__(),让 ElectricCar 实例包含父类的所有属性。父类也称为超类(superclass),名称super因此而得名。

# 输入
class Car(object):
    def __init__(self,band,model,year):
        self.band = band
        self.model = model
        self.year = year
        self.mile = 300

    def get_info(self):
        print(
            "My car is " + self.band.title() + " "
            + self.model + " and bought in " + str(self.year))

    def report_odometer(self):
        print("The mile drving is " + str(self.mile))

class UsedCar(Car):
    def __init__(self,band,model,year):
        super().__init__(band,model,year)

usedcar = UsedCar("Audi","A4",2016)
usedcar.report_odometer()

# 输出
The mile drving is 300

给子类定义属性和方法
 让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。你可以根据所需的准确程度添加任意数量的属性和方法。如果一个属性或方法是父类都有的,而不是子类特有的,就应将其加入到父类而不是子类中。这样,使用父类的人将获得相应的功能,而子类只包含处理子类特有属性和行为的代码。

# 输入
class Car(object):
    def __init__(self,band,model,year):
        self.band = band
        self.model = model
        self.year = year
        self.mile = 300

    def get_info(self):
        print(
            "My car is " + self.band.title() + " "
            + self.model + " and bought in " + str(self.year))

    def report_odometer(self):
        print("The mile drving is " + str(self.mile))

class UsedCar(Car):
    def __init__(self,band,model,year):
        super().__init__(band,model,year)

    def reportformerdriver(self,driver):
        self.driver = driver
        print("This car former driver is " + self.driver)

usedcar = UsedCar("Audi","A4",2016)
usedcar.reportformerdriver("Youth")

# 输出
This car former driver is Youth

重写父类的方法
 对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

#  输入
class Car(object):
    def __init__(self,band,model,year):
        self.band = band
        self.model = model
        self.year = year
        self.mile = 0

    def get_info(self):
        print(
            "My car is " + self.band.title() + " "
            + self.model + " and bought in " + str(self.year))

    def report_odometer(self):
        print("The mile is " + str(self.mile) + ". Because this car is new car")

class UsedCar(Car):
    def __init__(self,band,model,year):
        super().__init__(band,model,year)

    def reportformerdriver(self,driver):
        self.driver = driver
        print("This car former driver is " + self.driver)

    def report_odometer(self):
        print("The odometer should not be 0 " )

my_car = Car("BMW","I8",2020)
my_car.report_odometer()
usedcar = UsedCar("Audi","A4",2016)
usedcar.report_odometer(600)


# 输出
The mile is 0. Because this car is new car
The odometer should not be 0 

将实例用作属性
 使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型类拆分成多个协同工作的小类。

# 输入
class Car(object):
    def __init__(self,band,model,year):
        self.band = band
        self.model = model
        self.year = year
        self.mile = 0

class Electriccar(Car):
    def __init__(self,band,model,year):
        super().__init__(band,model,year)
        self.voltage = Voltage()

class Voltage(object):
    def __init__(self,voltage = "12"):
        self.voltage = voltage

    def printvoltage(self,voltage):
        self.voltage = voltage
        print("The voltage is " + str(self.voltage))

    
mycar = Electriccar("Audi","A4",2021)
mycar.voltage.printvoltage(24)


# 输出
The voltage is 24

多继承
  Python 同样有限的支持多继承形式。多继承的类定义形如下例。需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

 具体的范例如下:

# 输入
class Car(object):
    def __init__(self,band,model,year):
        self.band = band
        self.model = model
        self.year = year
        self.mile = 0

    def printcarinfo(self):
        messge = "My car band is " + str(self.band)
        message += " and model is " + str(self.model)
        message += " which was bought in " + str(self.year)
        print(message)

class Electriccar(Car):
    def __init__(self,band,model,year):
        super().__init__(band,model,year)
        self.voltage = Voltage()

class Voltage(object):
    def __init__(self,voltage = "12"):
        self.voltage = voltage

    def printvoltage(self,voltage):
        self.voltage = voltage
        print("The voltage is " + str(self.voltage))


class Mycar(Electriccar,Voltage):
    def __init__(self,band,model,year):
        Electriccar.__init__(self,band,model,year)
        Voltage.__init__(self)

firstcar = Mycar("Audi","A4",2016)
firstcar.printvoltage(24)

# 输出
The voltage is 24

Guess you like

Origin blog.csdn.net/qq_42957717/article/details/118119194