Fork me on GitHub

Python类的创建、继承和导入

面向对象编程是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情境的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。使用面向对象编程可模拟现实情境。

关于类的创建、使用、继承和导入,具体方法如下:

以下的实例主要参考【Python编程从入门到实践 [美] Eric Matthes 著 袁国忠 译】这本书的第9章

然后加了一下自己的理解和其他不同的方法,若有侵权的行为发生,请告知,本人会立即删除。

  • 创建和使用类:

直接上具体的列子,创建一个名为python_class_create的.py文件

 1 # -*- coding: UTF-8 -*-
 2 
 3 class Dog():
 4     """关于狗的动作描述"""
 5     def __init__(self, name, age):
 6         self.name = name
 7         self.age = age
 8 
 9     def run(self):
10         """小狗被命令跑"""
11         print(self.name.title() + " is now running.")
12 
13     def roll_over(self, color):
14         """可以在这个函数中加上独特的属性"""
15         print(self.name.title() + " is a " + color + "'s dog, and it rolled over!")
16 
17 """对上述类的使用"""
18 my_dog = Dog('Lucy', 6)
19 my_dog.run()
20 my_dog.roll_over('black')
  • 类的继承

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

先写一个父类,文件名称为python_superclass.py

 1 # -*- coding: UTF-8 -*-
 2 
 3 class Car():
 4     """关于汽车的描述"""
 5     def __init__(self, make, model, year):
 6         """初始化描述汽车的属性"""
 7         self.make = make
 8         self.model = model
 9         self.year = year
10         self.odometer_reading = 0  # 给属性指定默认值
11 
12     def get_descriptive(self):
13         """返回描述性信息"""
14         long_name = str(self.year) + ' ' + self.make + ' ' + self.model
15         return long_name.title()
16     
17     def read_odometer(self):
18         """读取里程表"""
19         print("This car has " + str(self.odometer_reading) + " miles on it.")
20         
21     def update_odometer(self, mileage):
22         if mileage >= self.odometer_reading:
23             self.odometer_reading = mileage
24         else:
25             print("You can't roll back an odometer!")
26             
27     def increment_odometer(self, miles):
28         self.odometer_reading += miles

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

 1 class ElectricCar(Car):
 2     """电动车的独特之处"""
 3     def __init__(self, make, model, year):
 4         """初始化父类的属性"""
 5         super().__init__(make, model, year)
 6         """再初始化子类的属性"""
 7         self.battery_size = 70
 8         
 9     def describe_battery(self):
10         print("This car has a " + str(self.battery_size) + "-kWh battery.")
11         
12     """再子类中对父类的重写"""
13     '''
14     假设父类中有一个名为fill_gas_tank()的函数,但它对子类来说毫无意义,因此
15     你可能需要重写它
16     '''
17     def fill_gas_tank(self):
18         """电动汽车没有油箱"""
19         print("This car doesn't need a gas tank!")
20         
21 my_tesla = ElectricCar('tesla', 'model s', 2018)
22 my_tesla.describe_battery()
  • 导入类

随着你不断地给类添加功能,文件可能变得更长,即便你妥善地使用了继承亦如此。为遵循Python的总体理念,应让文件尽可能简洁。为在这方面提供帮助,Python允许将类储存在模块中,然后在主程序中导入所需的模块,例如上述的python_superclass.py文件。

新建一个

你可以导入一个类,也可以导入多个类

 1 # -*- coding:UTF-8 -*-
 2 
 3 from python_superclass import Car, ElectricCar
 4 
 5 """导入所有类"""
 6 from python_superclass import *
 7 
 8 my_beetle = Car('volkswagen', 'beetle', 2018)
 9 print(my_beetle.get_descriptive())
10 
11 my_tesla = ElectricCar('tesla', 'roadster', 2017)
12 print(my_tesla.get_descriptive())

另外一种方法:

 1 # -*- coding:UTF-8 -*-
 2 
 3 """导入模块"""
 4 import python_superclass
 5 
 6 my_beetle = python_superclass.Car('volkswagen', 'beetle', 2018)
 7 print(my_beetle.get_descriptive())
 8 
 9 my_tesla = python_superclass.ElectricCar('tesla', 'roadster', 2017)
10 print(my_tesla.get_descriptive())

以上导入类的方法有一个前提,这些模块必须在同一目录下,某则的话会报错,如下:

 

下面关于导入另一目录下类的方法进行简述:

此时python_import_class.py文件在目录为:H:\Python Procedure\python class的文件夹下,而python_superclass.py文件在目录为:H:\Python Procedure\python dictionary的文件夹下,

针对这种情况的解决方法如下:

 1 # -*- coding:UTF-8 -*-
 2 
 3 import sys
 4 sys.path.append(r"H:/Python Procedure/python dictionary")
 5 import python_superclass
 6 
 7 my_beetle = python_superclass.Car('volkswagen', 'beetle', 2018)
 8 print(my_beetle.get_descriptive())
 9 
10 my_tesla = python_superclass.ElectricCar('tesla', 'roadster', 2017)
11 print(my_tesla.get_descriptive())

同样,如果是放在了上级目录或者下级目录中,也可以使用上述方法,可以认为它是一种通用的方法。

当你看到这篇文章的时候,希望上述的内容能够对你有所帮助,当然,有什么错的地方,也请你提出来,我会多多改正。

posted @ 2019-09-03 14:39  幻听的博客  阅读(1968)  评论(0编辑  收藏  举报