面向对象编程是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情境的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。使用面向对象编程可模拟现实情境。
关于类的创建、使用、继承和导入,具体方法如下:
以下的实例主要参考【Python编程从入门到实践 [美] Eric Matthes 著 袁国忠 译】这本书的第9章
然后加了一下自己的理解和其他不同的方法,若有侵权的行为发生,请告知,本人会立即删除。
创建和使用类:
直接上具体的列子,创建一个名为python_class_create的.py文件
1 #-*- coding: UTF-8 -*-
2
3 classDog():4 """关于狗的动作描述"""
5 def __init__(self, name, age):6 self.name =name7 self.age =age8
9 defrun(self):10 """小狗被命令跑"""
11 print(self.name.title() + "is now running.")12
13 defroll_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 classCar():4 """关于汽车的描述"""
5 def __init__(self, make, model, year):6 """初始化描述汽车的属性"""
7 self.make =make8 self.model =model9 self.year =year10 self.odometer_reading = 0 #给属性指定默认值
11
12 defget_descriptive(self):13 """返回描述性信息"""
14 long_name = str(self.year) + ' ' + self.make + ' ' +self.model15 returnlong_name.title()16
17 defread_odometer(self):18 """读取里程表"""
19 print("This car has" + str(self.odometer_reading) + "miles on it.")20
21 defupdate_odometer(self, mileage):22 if mileage >=self.odometer_reading:23 self.odometer_reading =mileage24 else:25 print("You can't roll back an odometer!")26
27 defincrement_odometer(self, miles):28 self.odometer_reading += miles
创建子类时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法__init__()需要父类施以援手。
1 classElectricCar(Car):2 """电动车的独特之处"""
3 def __init__(self, make, model, year):4 """初始化父类的属性"""
5 super().__init__(make, model, year)6 """再初始化子类的属性"""
7 self.battery_size = 70
8
9 defdescribe_battery(self):10 print("This car has a" + str(self.battery_size) + "-kWh battery.")11
12 """再子类中对父类的重写"""
13 '''
14 假设父类中有一个名为fill_gas_tank()的函数,但它对子类来说毫无意义,因此15 你可能需要重写它16 '''
17 deffill_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 importCar, ElectricCar4
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 importpython_superclass5
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 importsys4 sys.path.append(r"H:/Python Procedure/python dictionary")5 importpython_superclass6
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())
同样,如果是放在了上级目录或者下级目录中,也可以使用上述方法,可以认为它是一种通用的方法。
当你看到这篇文章的时候,希望上述的内容能够对你有所帮助,当然,有什么错的地方,也请你提出来,我会多多改正。