zoukankan      html  css  js  c++  java
  • Python 学习笔记15 类

    我们在编程的过程中,并非都是要重头开始。比如其他人已经有现成的类,我们可以使用其他找人编写的类。术语称之为: 继承。

    当一个类继承例外一个类时,它可以获得这个类的所有属性和方法:原有的类称之为 父类,新的类称之为子类。子类可以继承父类的所有方法和属性,还可以自定一些自己的方法和属性。

    比如我们已经有了一个叫汽车的父类,我们可以继承这个类,生成一个电动车的子类:

    #-*- coding:utf-8 -*-
    
    class Car():
    
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer_reading = 0
    
        def get_description_name(self):
            long_name = str(self.year) + ' ' + self.make + ' ' + self.model
            return long_name.title()
    
        def read_odometer(self):
            print("This car has " + str(self.odometer_reading) + " miles on it.")
    
        def update_odometer(self, mileage):
            if mileage >= self.odometer_reading:
                self.odometer_reading = mileage
            else:
                print("You cannot do that.")
    
        def increase_odometer(self, miles):
            if miles >= 0:
                self.odometer_reading += miles
            else:
                print("The value is invalid, please input the number which should more than zero.")
    
    '''继承car,生成一个新类'''
    class ElectricCar(Car):
        def __init__(self, make, model, year):
            super().__init__(make, model, year)
    
    
    
    my_BYD = ElectricCar("BYD", "Tang", 2019)
    print(my_BYD.get_description_name())
    
    
    '''
    输出:
    2019 Byd Tang
    '''

    通过上面的代码,我们看到,我们基于一个car的父类,生成了一个ElectricCar的子类。

    在类定义是,在括号里面包含父类的名称,来表示继承这个类: class NewClass(SupperClass)。

    而真正继承父类的方法和属性的,则是在__init__方法中的super()方法的使用,该方法告诉Python使用父类的__init__方法,来重新构造一个类。

    通过上面的例子,我们可以看到,子类可以正确的调用父类的方法,实际上这时已经是子类的方法了。

    我们也可以根据累的特性,给子类定义自己特有的属性和方法:

    比如电动车有一个电瓶,并且有方法可以实时的显示当前的电量。

    #-*- coding:utf-8 -*-
    
    class Car():
    
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer_reading = 0
    
        def get_description_name(self):
            long_name = str(self.year) + ' ' + self.make + ' ' + self.model
            return long_name.title()
    
        def read_odometer(self):
            print("This car has " + str(self.odometer_reading) + " miles on it.")
    
        def update_odometer(self, mileage):
            if mileage >= self.odometer_reading:
                self.odometer_reading = mileage
            else:
                print("You cannot do that.")
    
        def increase_odometer(self, miles):
            if miles >= 0:
                self.odometer_reading += miles
            else:
                print("The value is invalid, please input the number which should more than zero.")
    
    '''继承car,生成一个新类'''
    class ElectricCar(Car):
        def __init__(self, make, model, year):
            super().__init__(make, model, year)
            self.battery_size = 100
    
        def describe_battery(self):
            print("Catr has " + str(self.battery_size) + "-kwh battery. " )
    
    
    
    my_BYD = ElectricCar("BYD", "Tang", 2019)
    print(my_BYD.get_description_name())
    my_BYD.describe_battery()
    
    
    '''
    输出:
    2019 Byd Tang
    Catr has 100-kwh battery. 
    '''

    在上述代码中,我们可以看到,我们在__init__方法中,添加了一个电瓶容量的属性,

    self.battery_size = 100
    

    并且添加了一个电动车特有的显示电量的方法。

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

    这些方法是属于子类(ElectricCar)的,它能够正确的被运行。

    当父类中的某些方法,并不适用子类的时候怎么办呐?我们可以在子类中重新定义该方法。

    比如Car类中有加汽油的方法,而这对电动车并不适用,我们可以在子类中对这个方法进行覆盖重写。子类在调用这个方法时,将采用子类的定义:

    #-*- coding:utf-8 -*-
    
    class Car():
    
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer_reading = 0
    
        def get_description_name(self):
            long_name = str(self.year) + ' ' + self.make + ' ' + self.model
            return long_name.title()
    
        def read_odometer(self):
            print("This car has " + str(self.odometer_reading) + " miles on it.")
    
        def update_odometer(self, mileage):
            if mileage >= self.odometer_reading:
                self.odometer_reading = mileage
            else:
                print("You cannot do that.")
    
        def increase_odometer(self, miles):
            if miles >= 0:
                self.odometer_reading += miles
            else:
                print("The value is invalid, please input the number which should more than zero.")
    
        def fill_gas(self):
            print("Car is filling gas.")
    
    '''继承car,生成一个新类'''
    class ElectricCar(Car):
        def __init__(self, make, model, year):
            super().__init__(make, model, year)
            self.battery_size = 100
    
        def describe_battery(self):
            print("Catr has " + str(self.battery_size) + "-kwh battery. " )
    
        def fill_gas(self):
            print("Electric car no gas tank.")
    
    
    
    my_BYD = ElectricCar("BYD", "Tang", 2019)
    my_BYD.fill_gas()
    
    
    '''
    输出:
    Electric car no gas tank.
    '''

    我们在编写代码时候,需要灵活的对类进行定义。在编程思想中,现实生活中的所有对象,都可以被定义成类。

    我们尽可能多订一些类,以简化我们的代码长度,同时也变成程序代码的维护和修改。

    比如在上述例子中,我们对电动车类增加了一个电池的属性和相关的方法。其实我们也可以新建一个电池的类,将电池特有的属性和方法独立开来。这样我们可以根据这个类生成各式各样的实例:

    #-*- coding:utf-8 -*-
    
    class Car():
    
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer_reading = 0
    
        def get_description_name(self):
            long_name = str(self.year) + ' ' + self.make + ' ' + self.model
            return long_name.title()
    
        def read_odometer(self):
            print("This car has " + str(self.odometer_reading) + " miles on it.")
    
        def update_odometer(self, mileage):
            if mileage >= self.odometer_reading:
                self.odometer_reading = mileage
            else:
                print("You cannot do that.")
    
        def increase_odometer(self, miles):
            if miles >= 0:
                self.odometer_reading += miles
            else:
                print("The value is invalid, please input the number which should more than zero.")
    
        def fill_gas(self):
            print("Car is filling gas.")
    
    
    '''生成一个电池类'''
    class Battery():
        def __init__(self, size = 100):
            self.size = size
    
        def describe_battery(self):
            print("Battery has " + str(self.size) + "-kwh battery. " )
    
    '''继承car,生成一个新类'''
    class ElectricCar(Car):
        def __init__(self, make, model, year):
            super().__init__(make, model, year)
            self.battery = Battery()
    
        def fill_gas(self):
            print("Electric car no gas tank.")
    
    
    
    my_BYD = ElectricCar("BYD", "Tang", 2019)
    my_BYD.battery.describe_battery()
    
    
    '''
    输出:
    Battery has 100-kwh battery. 
    '''

    我么可以看到我们增加了一个电池类Battery(),该类有自己属性 size和方法describe_battery。我们在定义电动车时,增加了一个battery的属性,这个属性是一个baterry的实例,我们可以认为该属性实际上是一个对象 object,我们可以操作和使用它的属性和方法。

    这样做的好处就是,有关电池的属性和方法的修改,可以放在battery类中进行处理。EelctricCar类中,只关注与其相关的属性和方法。比如我们可以添加一个电池能跑多少里程的方法,该方法与电池的容量相关:

    #-*- coding:utf-8 -*-
    
    class Car():
    
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer_reading = 0
    
        def get_description_name(self):
            long_name = str(self.year) + ' ' + self.make + ' ' + self.model
            return long_name.title()
    
        def read_odometer(self):
            print("This car has " + str(self.odometer_reading) + " miles on it.")
    
        def update_odometer(self, mileage):
            if mileage >= self.odometer_reading:
                self.odometer_reading = mileage
            else:
                print("You cannot do that.")
    
        def increase_odometer(self, miles):
            if miles >= 0:
                self.odometer_reading += miles
            else:
                print("The value is invalid, please input the number which should more than zero.")
    
        def fill_gas(self):
            print("Car is filling gas.")
    
    
    '''生成一个电池类'''
    class Battery():
        def __init__(self, size = 100):
            self.size = size
    
        def describe_battery(self):
            print("Battery has " + str(self.size) + "-kwh battery. " )
    
        def show_range(self):
            print("Battery has " + str(self.size * 3) + " killmaters on full charge")
    
    '''继承car,生成一个新类'''
    class ElectricCar(Car):
        def __init__(self, make, model, year):
            super().__init__(make, model, year)
            self.battery = Battery()
    
        def fill_gas(self):
            print("Electric car no gas tank.")
    
    
    
    my_BYD = ElectricCar("BYD", "Tang", 2019)
    
    my_BYD.battery.describe_battery()
    my_BYD.battery.show_range()
    my_BYD.battery.size = 200
    my_BYD.battery.describe_battery()
    my_BYD.battery.show_range()
    '''
    输出:
    Battery has 100-kwh battery. 
    Battery has 300 killmaters on full charge
    Battery has 200-kwh battery. 
    Battery has 600 killmaters on full charge
    '''
  • 相关阅读:
    天才难过四级关
    肉鸟一只
    继续折腾mac。os(没进展)
    Intel(R) ICH9M LPC Interface Controller 2919驱动安装方法
    nusoap的使用
    STL HASH_MAP简单应用
    jQuery select操作控制方法小结
    unordered_map详解
    STL map与Boost unordered_map
    [C/C++]关于C++11中的std::move和std::forward
  • 原文地址:https://www.cnblogs.com/wanghao4023030/p/10896836.html
Copyright © 2011-2022 走看看