类
# 9.1创建和使用类
## 使用类几乎可以模拟任何东西
## 创建一个类
from _typeshed import Self
    class Dog:
        """一次模拟小狗的简单尝试"""
        def __init__(self,name,age):
            """初始化属性name和age"""
            self.name=name         #self.name=name获取与形参name相关联的值
            self.age=age
### 以self为前缀的变量可以供类中所有方法使用
        def sit(self):
            """模拟小狗收到命令时蹲下"""
            print(f"{self.name} is now sitting.")
    
        def roll_over(self):
            """模拟小狗收到命令时打滚"""
            print(f"{self.name} rolled over!")
## 根据类创建实例
    class Dog:
     """一次模拟小狗的简单尝试"""
     def __init__(self,name,age):       #形参self自动向类中的方法传递指定的属性
            """初始化属性name和age"""
         self.name=name
            self.age=age
        def sit(self):
            """模拟小狗收到命令时蹲下"""
            print(f"{self.name} is now sitting.")
    
        def roll_over(self):
            """模拟小狗收到命令时打滚"""
            print(f"{self.name} rolled over!")
    my_dog=Dog('Willie',6) #指定实例的属性
    print(f"My dog's name is {my_dog.name}.")       #my_dog.name代码用来访问实例的属性
    print(f"My dog's name is {my_dog.age} years old.")
    my_dog=Dog('Willie',6)
    my_dog.sit()           #调用实例的方法
    my_dog.roll_over()
# 9.2使用类和实例
## car类
    class Car:
        """一次模拟汽车的简单尝试"""
        def __init__(self,make,model,year):
            """初始化描述汽车的属性。"""
            self.make=make
            self.model=model
            self.year=year
    
        def get_descriptive_name(self):
            """返回整洁的描述性信息"""
            long_name=f"{self.year} {self.make} {self.model}"
            return long_name.title()
    my_new_car=Car('audi','a4',2019)
    print(my_new_car.get_descriptive_name())
## 给属性指定默认值
    classclass Car:
        """一次模拟汽车的简单尝试"""
        def __init__(self,make,model,year):
            """初始化描述汽车的属性。"""
            self.make=make
            self.model=model
            self.year=year
            self.odometer_reading=0  #创建一个名为odometer_reading的属性,并将其初始值设为0,该值不会被传递给类的参数改变
        def get_descriptive_name(self):
            """返回整洁的描述性信息"""
            long_name=f"{self.year} {self.make} {self.model}"
            return long_name.title()
        def read_odometer(self):
            """打印一条指出汽车里程的消息"""
            print(f"This car has {self.odometer_reading} miles on it.")
    my_new_car=Car('audi','a4',2019)
    print(my_new_car.get_descriptive_name)
    my_new_car.read_odometer()
## 直接修改属性的值
    my_new_car.odometer_reading=23   
    my_new_car.read_odometer() 
    ##通过方法修改属性的值
    class Car:
        """一次模拟汽车的简单尝试"""
        def __init__(self,make,model,year):
            """初始化描述汽车的属性。"""
            self.make=make
            self.model=model
            self.year=year
    
        def get_descriptive_name(self):
            """返回整洁的描述性信息"""
            long_name=f"{self.year} {self.make} {self.model}"
            return long_name.title()
        def read_odometer(self):
            """打印一条指出汽车里程的消息"""
            print(f"This car has {self.odometer_reading} miles on it.")
        def update_odometer(self,mileage):
            """将里程碑读数设置为指定的值"""
            Self.odometer_reading=mileage
    my_new_car=Car('audi','a4',2019)
    print(my_new_car.get_descriptive_name())
    my_new_car.update_odometer(23)    #在括号内传递参数
    my_new_car.read_odometer()
# 9.3继承
## 子类的方法__init__
## 一个类继承 另一个类时,它将自动获得另一个类的所有属性和方法
    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 = f"{self.year} {self.make} {self.model}"
        return long_name.title()
    def read_odometer(self):
        print(f"This car has {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())
### super() 是一个特殊函数,帮助Python将父类和子类关联起来。
### 在Python 2.7中,继承语法稍有不同,函数super() 需要两个实参:子类名和对象self
## 给子类定义属性和方法
    class Car:
        """一次模拟汽车的简单尝试"""
        def __init__(self,make,model,year):
            """初始化描述汽车的属性。"""
            self.make=make
            self.model=model
            self.year=year
    
        def get_descriptive_name(self):
        """返回整洁的描述性信息"""
            long_name=f"{self.year} {self.make} {self.model}"
            return long_name.title()
        def read_odometer(self):
            """打印一条指出汽车里程的消息"""
            print(f"This car has {self.odometer_reading} miles on it.")
        def update_odometer(self,mileage):
            """将里程碑读数设置为指定的值"""
            Self.odometer_reading=mileage
    class ElectricCar(Car):
        """电动汽车的独特之处"""
        def __init__(self, make, model, year):
            """
            初始化父类的各项属性
            再初始化电动汽车特有的属性
            """
            super().__init__(make, model, year)
            self.battery_size=75
        def describe_battery(self):
            """打印一条描述电瓶容量的消息"""
            print(f"This car has a {self.battery_size} -kwh battery.")
    my_tesla=ElectricCar('tesla','model s',2019)
    print(my_tesla.get_descriptive_name())   #调用父类的方法
    my_tesla.describe_battery()
## 重写父类的方法:
### 在子类中定义一个和父类中的某一方法同名的方法即可重写父类中相应的方法
## 将实例用作属性
    class Battery:
        """一次模拟电动汽车电瓶的尝试"""
        def __init__(self,battery_size=75):
            """初始化电瓶的属性"""
            self.battery_size=battery_size
    
        def describe_battery(self):
            """打印一条描述电瓶容量的消息"""
            print(f"This car has a {self.battery_size} -kwh battery.")
    
## 导入类
    """
    使用from car import Car
    可以从一个模块中导入多个类,使用逗号隔开
    """
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号