python学习8:类
1 创建和使用类
1.1 创建Dog类
根据Dog类创建的每个实例都将存储名字和年龄,我们赋予每条小狗蹲下sit()
和打滚roll_over()
的能力:
class Dog:
"""一次模拟小狗的简单尝试。"""
def __init__(self, name, age):
"""初始化属性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!")
- 根据约定,在Python中,首字母大写的名称指的是类。
- 方法
__init__()
:类中的函数称为方法。 而__init__()
是一个特殊的方法,每次根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线。 - 这个方法的定义中形参self必不可少,而且必须位于其他形参的前面。每个与实例相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
- 以self为前缀的变量可供类中的所有方法使用,可以通过类的任何实例来访问。
- Dog类还定义了另两个方法:
sit()
和roll_over()
。这些方法执行时不需要额外的信息,因此他们只有一个形参self。
1.2 根据类创建实例
可将类视作有关如何创建实例的说明。Dog类是一系列说明,让python知道如何创建表示特定小狗的实例。
my_dog = Dog('Willie', 6)
print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} year old.")
my_dog.sit()
my_dog.roll_over()
结果:
My dog's name is Willie.
My dog is 6 year old.
Willie is now sitting.
Willie rolled over!
2 使用类和实例
类编写好后,大部分时间将花在根据类创建的实例上。需要执行的一个重要任务是修改实例的属性。
2.1 Car类
下面编写一个表示汽车的类。
class Car:
"""a simple attempt to simulate a car"""
def __init__(self, make, model, year):
"""initialize the attributes that describe the car"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""return neat descriptive information"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
"""print a message indicating car odometer"""
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()
一开始汽车的里程为0:
2019 Audi A4
This car has0 miles on it.
2.2 修改属性的值
- 直接修改属性的值
通过实例直接访问,使用句点表示法直接访问并设置汽车的属性odometer_reading
。
class Car:
--snip--
my_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
- 通过方法修改属性的值
将值传递给方法,由其在内部进行更新。
class Car:
--snip--
def update_odometer(self,mileage):
"""set the odometer reading to the specified value"""
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()
添加了方法update_odometer()
。该方法接受一个里程值,并赋值给self.odometer_reading
。
以上方法结果均为:
2019 Audi A4
This car has 23 miles on it.
3 继承
一个类继承另一个类时,将自动获得另一个类所有的属性和方法。原有的类称为父类,而新类称为子类。
3.1 子类的方法__init__()
在原有类的基础上编写新类时,通常要调用父类的方法__init__()。这将初始化在父类__init__()方法中定义的所有属性,从而让子类包含这些属性。
class Car:
"""a simple attempt to simulate a car"""
def __init__(self, make, model, year):
"""initialize the attributes that describe the car"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_name(self):
"""return neat descriptive information"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
"""print a message indicating car odometer"""
print(f"This car has {self.odometer_reading} miles on it.")
def update_odometer(self, mileage):
"""set the odometer reading to the specified value"""
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):
"""the uniqueness of electric vehicles"""
def __init__(self, make, model, year):
"""initialize the properties of the parent class"""
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())
- 其中
super()
是一个特殊的函数,让你可以调用父类的方法。这行代码让python调用car类的方法__init__()
,让electriccar实例包含这个方法中定义的所有属性。
4 导入类
4.1 导入单个类
from car import Car
my_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
import
让python打开模块car导入其中的Car类。
4.2 导入多个类
from car import Car, ElectriCar
4.3 导入整个模块
import car
5 python标准库
熟悉并利用好python中的标准库是必要的。