Python学习之路(9)类

茴香豆 Lv5

面向对象是最有效的软件编写方法之一。在本章中,你将编写一些类并创建其实例。你将指定可在实例中存储什么信息,定义可对这些实例执行哪些操作。你还将编写一些类来扩展既有类的功能,让相似的类能够高效地共享代码。你还将把自己编写的类存储在模块中,并在自己的程序文件中导入其他程序员编写的类。

1. 创建和使用类

使用类几乎可以模拟任何东西。下面来编写一个表示小狗的简单类Dog。

1.1创建Dog类

1
2
3
4
5
6
7
8
9
10
11
12
class Dog():
'''dog class dog 类'''
def __init__(self, name, age):
'''init name, age 初始化name,age'''
self.name = name
self.age = age
def sit(self):
'''sit when be ordered 被命令时蹲下'''
print(self.name.title() + " is now sitting.")
def roll_over(self):
'''roll_over when be ordered 被命令时蹲下'''
print(self.name.title() + " rolled over!")

方法_init_()是一个特殊的方法,每当你根据Dog类创建新实例时,Python会自动运行它。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。

1.2根据类创建实例

创建实例:

1
my_dog = Dog('willie', 6)

调用属性:

1
2
3
4
5
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
# output:
My dog’s name is Willie.
My dog is 6 years old.

调用方法:

1
2
3
4
5
my_dog.sit()
my_dog.roll_over()
# output:
Willie is now sitting.
Willie rolled over!

2. 使用类和实例

类编写好后,你的大部分时 间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改 实例的属性。你可以直接修改实例的属性,也可以编写方法以特定的方式 进行修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 10
def get_descriptive_name(self):
"""返回整洁的描性信息"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def update_year(self, year):
"""将年份修为指定的值"""
self.year = year
def increment_odometer(self, miles):
"""将里程读数增加指定的量"""
self.odometer_reading += miles
def fill_gas_tank(self):
"""加满油箱"""
print("This car has been filled!")
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
# output: 2016 Audi A4
# 1. 直接修改属性的值
my_new_car.year = 2019
print(my_new_car.get_descriptive_name())
# output: 2019 Audi A4
# 2. 通过方法修改属性的值
my_new_car.update_year(2021)
print(my_new_car.get_descriptive_name())
# output: 2021 Audi A4
# 3. 通过方法使属性的值进行递增
my_new_car.increment_odometer(100)
print(my_new_car.odometer_reading)
# output: 110
my_new_car.fill_gas_tank()
# output: This car has been filled!

3. 继承

编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

3.1子类的方法_init_()

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法_init_() 需要父类施以援手。

1
2
3
4
5
6
7
8
9
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
# super使子类可以调用父类的方法,父类也称超类(superclass)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
# output: 2016 Tesla Model S

3.2重写父类的方法

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法

1
2
3
4
5
6
7
8
9
10
11
12
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year)
# super使子类可以调用父类的方法,父类也称超类(superclass)
def fill_gas_tank(self):
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
my_tesla = ElectricCar('tesla', 'model s', 2016)
my_tesla.fill_gas_tank()
# output: This car doesn't need a gas tank!

3.3将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型类拆分成多个协同工作的小类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)
# super使子类可以调用父类的方法,父类也称超类(superclass)
self.battery = Battery()
def fill_gas_tank(self):
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
my_tesla = ElectricCar('tesla', 'model s', 2016)
my_tesla.battery.describe_battery()
# output: This car has a 70-kWh battery.

4. 导入类

1
2
3
4
5
6
7
8
# 导入单个类
from car import Car
# 从一个模块导入多个类
from car import Car, ElectricCar
# 导入整个模块
import car
# 导入模块中的所有类
from car import *

5. Python标准库

Python标准库 是一组模块,安装的Python都包含它。你现在对类的工作原 理已有大致的了解,可以开始使用其他程序员编写好的模块了。可使用标准库中的任何函数和类,为此只需在程序开头包含一条简单的import语句。

  • Title: Python学习之路(9)类
  • Author: 茴香豆
  • Created at : 2022-07-03 21:03:30
  • Updated at : 2022-10-02 15:46:12
  • Link: https://hxiangdou.github.io/2022/07/03/Python_9/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments