2020.07.15 Python 入门的 Day8
成就:类及其模块化
- 使用类几乎可以模拟任何东西,根据类来创建对象被称为实例化。
- 下述代码是一个 Dog 类:
# 类中的函数被称为方法 class Dog(): def __init__(self, name, age): self.name = name self.age = age # 方法 __init__() 是一个特殊的方法 # 方法 __init__() 包含三个形参, self, name, age # self 是必不可少的,并且必须在其他形参的前面 # self 是一个指向实例本身的引用,会自动传递 # 当我们根据 Dog 类去创建实例的时候,只需给最后两个形参提供值 # 以 self 为前缀的变量都可以供类中的所有方法使用 # 像这样可以通过实例访问的变量成为属性 def sit(self): print(self.name.title() + 'is now sitting.') def roll_over(self): print(self.name.title() + " rolled over!")
- 可将类视为如何创建实例的说明,下述代码是创建一个表示特定小狗的实例:
my_dog = Dog('willie', 6) your_dog = Dog('lucy', 3) # 创建小狗 print("My dog's name is " + my_dog.name.title() + ".") print("My dog is " + str(my_dog.age) + " years old.") # 使用句点表示法访问实例的属性 my_dog.sit() my_dog.roll_over() your_dog.sit() your_dog.roll_over() # 使用句点表示法调用实例中的方法
- 下述是一个创建表示汽车的类的代码:
class Car(): def __init__(self, make, model, year): self.make = make self.model = model self.year = year self.odometer_reading = 0 # 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): if miles >= 0: self.odometer_reading += miles else: print("You can't roll back an odometer!")
- 下述为三种修改属性的值的方法
my_new_car.odometer_reading = 23 # 第一种:直接修改属性的值 my_new_car.update_odometer(24) # 第二种:编写更新属性的方法 my_new_car.increment_odometer(1) # 第三种:通过方法对属性的值进行递增
- 如果要编写的类是另一个现成的类的特殊版本,可用继承。
- 一个类继承另一个类时,会自动获得另一个类的属性和方法。
- 原有的类称为父类(超类),新的类称为子类。
class ElectricCar(Car): def __init__(self, make, model, year): super().__init__(make, model, year) # 新的类 ElectricCar 继承了父类 Car # super()是一个特殊的函数,将父类和子类关联起来 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.") def fill_gas_tank(self): print("This car donesn't need a gas tank!") # 新的方法
- 如果父类有不适用于子类的方法,可直接重写,调用子类的方法时 Python 会以新的为准。
- 可以将类的一部分作为一个独立的类提取出来,将实例用作属性。
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(100) # self.battery 是一个 Battery 类的实例,也是 ElectricCar 类的一个属性 my_tesla.battery.describe_battery() # 调用时用句号表示法
- 类可作为一个模块被导入到一个文件中,样例如下:
from Car import Car # 从 Car.py 里导入 Car 类 my_new_car = Car('audi', 'a4', 2016) print(my_new_car.get_descriptive_name()) my_new_car.odometer_reading = 23 my_new_car.read_odometer() # 调用时正常使用 # 当然也可以直接导入整个模块(import Car) # 但是调用时要用句号表示法加前缀 # 不推荐全部导入(from module_name import *)
- Python 中有很多标准库,库中有很多封存的类,可以直接调用。