9.1创建和使用类
9.1.1创建Dog类
class Dog: def __init__(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.!")
9.1.2根据类创建实例
my_dog = Dog("willie", 6) print(f"My dog's name is {my_dog.name}") print(f"My dog is {my_dog.age} years old")
1.访问属性
my_dog.name
2.调用方法
my_dog.sit() my_dog.roll_over()
3.创建多个实例
my_dog = Dog("willie", 6) my_dog.sit() my_dog.roll_over() your_dog = Dog("Lucy", 3) print(f"Your dog's name is {your_dog.name}") print(f"Your dog is {your_dog.age} years old")
9.2使用类和实例
9.2.1Car类
编写一个汽车类
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())
9.2.2给属性指定默认值
创建实例时,有些属性无须通过形参来定义,可在方法_init_()中为其指定默认值
class Car: def __init__(self, make, model, year): self.make = make self.model = model self.year = year self.odometer = 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} miles on it.") my_new_car = Car("audi", "a4", "2019") print(my_new_car.get_descriptive_name()) my_new_car.read_odometer()
9.2.3修改属性的值
1.直接修改属性的值
要修改属性的值,最简单的方式就是通过实例直接访问它。
my_new_car.odometer = 23 my_new_car.read_odometer()
2.通过方法修改属性的值
可以无须修改属性值,而是将值传递给方法,由方法在内部进行更新。
类内部添加: def update_odometer(self, mileage): self.odometer = mileage
my_new_car.update_odometer(24) my_new_car.read_odometer()
3.通过方法对属性的值进行递增
有时候需要将属性值递增为特定的量,而不是将其设置为全新的值。
类内部添加: def increment_odometer(self, miles): self.odometer += miles
my_new_car.increment_odometer(30) my_new_car.read_odometer()
9.3继承
如果要编写的类是另外一个类的特殊版本,可使用继承
一个类继承另一个类时,将自动获得另一个类的所有方法和属性。原来的类叫做父类,新类称之为子类
9.3.1 子类的方法_init_()
编写新类时,将初始化在父类_init_()方法中定义的所有属性,从而让子类包含这些属性
在Car类的基础上创建新类ElectricCar
class ElectricCar(Car): def __init__(self, make, model, year): super().__init__(make, model, year) my_tesla = ElectricCar("tesla", "model s", "2019") print(my_tesla.get_descriptive_name())
9.3.2给子类定义属性和方法
让一个类继承另一个类后,就可以添加区分子类和父类所需的新属性和新方法了。
下面添加一个电动汽车特有的属性(电瓶),以及一个描述该属性的方法。
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()
9.3.3重写父类的方法
对于父类的方法,只要他不符合子类模拟的实物的行为,都可以进行重写。
为此 ,可在子类中定义一个与要重写的父类方法同名的方法。
class ElectricCar(Car): def fill_gas_tank(self): print("This car doesn't need a gas tank!")
现在如果对电动汽车调用方法fill_gas_tank(),python将忽略car类中的方法fill_gas_tank()
9.3.4将实例用作属性
在给类添加的细节越来越多,属性和方法清单以及文件都会越来越长。在这种情况下,可将类的一部分提取戳来,作为一个独立的类。
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_size}-kwh battery.") class ElectricCar(Car): def __init__(self, make, model, year): super().__init__(make, model, year) self.battery = Battery() my_tesla.battery.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.") def get_range(self): if self.battery_size == 75: range = 260 elif self.battery_size == 100: range = 315 print(f"This car can go about {range} miles on a full charge")
9.3.5模拟实物
9.4导入类
9.4.1导入单个类
class Car: def __init__(self, make, model, year): self.make = make self.model = model self.year = year self.odometer = 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} miles on it.") def update_odometer(self, mileage): self.odometer = mileage def increment_odometer(self, miles): self.odometer += miles
from car import Car #从car.py中导入Car这个类
.........
9.4.2在一个模块中存储多个类
虽然在同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。
from car import ElectricCar
9.4.3从一个模块中导入多个类
可根据需要在程序文件中导入任意数量的类。
from car import Car,ElectricCar
9.4.4导入整个模块
还可以导入整个模块,再使用句点表示法访问需要的类。
import car my_beetle = car.Car("volkswagen","beetle",2019)
9.4.5导入模块中的所有类
from module_name import *
9.4.6在一个模块中导入另一个模块
有时候,需要将类分散到多个模块中,以免模块太大或在同一个模块中存储不相关的类。
将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类。在这种情况下,可在前一个模块中导入必要的类
from car import Car
ElectricCar类需要访问其父类Car,因此在上处直接将Car类导入该模块中。
9.4.7使用别名
在程序中创建大量电动汽车时,需要反复输入ElectricCar,十分繁琐
为避免这种情况,可在import语句中指定一个别名。
from electric_car import ElectricCar as EC my_tesla = EC("tesla", "roadster", 2019)
9.5python标准库
python标准库是一组模块,我们可以使用标准库中的任何函数和类。
from random import randint print(randint(1,6))