python:入门到实践书籍学习(七)

第9章

  编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。

  根据类来创建对象被称为实例化,这让我们能够使用类的实例。

  类的创建:

    根据Dog 类创建的每个实例都将存储名字和年龄。我们赋予了每条小狗蹲下(sit() )和打滚(roll_over() )的能力

class Dog():
    """一次模拟小狗的简单尝试"""
    def __init__(self, name, age): 
        """初始化属性name和age"""
        self.name = name
        self.age = age
    def sit(self): 
        """模拟小狗被命令时蹲下""" 
        print(self.name.title() + " is now sitting.") 
    def roll_over(self): 
        """模拟小狗被命令时打滚""" 
        print(self.name.title() + " rolled over!")                

    方法__init__() 是一个特殊的方法,每当你根据Dog 类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。

    __init__() 定义成了包含三个形参:self 、name 和age 。在这个方法的定义中,形参self 必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self 呢?因为Python调用这个__init__() 方法来创建Dog 实例时,将自动传入实参self 。每个与类相关联的方法调用都自动传递实参self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

  类实例创建:可按需求根据类创建任意数量的实例

'''
dog类上例已创建
'''
my_dog = Dog('willie', 6) 
# 访问属性 类实例名.属性名
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
# 调用类方法 类实例名.方法名
print(my_dog.sit())

  修改类属性值的方法

  1.要修改属性的值,最简单的方式是通过实例直接访问它。

  2.通过方法修改属性的值。

  3.通过方法对属性的值进行递增。

  类继承:

  一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类 ,而新类称为子类 。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

    class Car(): 
        """一次模拟汽车的简单尝试""" 
        def __init__(self, make, model, year): 
            self.make = make 
            self.model = model 
            self.year = year 
            self.odometer_reading = 0 
            
        def get_descriptive_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 can't roll back an odometer!") 
        def increment_odometer(self, miles): 
            self.odometer_reading += miles
    class ElectricCar(Car): 
        """电动汽车的独特之处"""
        def __init__(self, make, model, year): 
            """初始化父类的属性"""
            super().__init__(make, model, year)
    my_tesla = ElectricCar('tesla', 'model s', 2016) 
    print(my_tesla.get_descriptive_name())

  让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。

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.")

my_tesla = ElectricCar('tesla', 'model s', 2016) print(my_tesla.get_descriptive_name()) 
my_tesla.describe_battery()    

  重写父类方法:

class ElectricCar(car):    
    def fill_gas_tank(): 
        """电动汽车没有油箱""" 
        print("This car doesn't need a gas tank!")

  不断给ElectricCar 类添加细节时,我们可能会发现其中包含很多专门针对汽车电瓶的属性和方法。在这种情况下,我们可将这些属性和方法提取出来,放到另一个名为Battery 的类中,并将一个Battery 实例用作ElectricCar 类的一个属性:

    class Car(): 
        --snip--
    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', 2016) 
    print(my_tesla.get_descriptive_name()) 
    my_tesla.battery.describe_battery()

  类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。

 

posted @ 2020-03-27 18:34  momingQI  阅读(154)  评论(0编辑  收藏  举报