面向对象编程是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情境的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。使用面向对象编程可模拟现实情境。
关于类的创建、使用、继承和导入,具体方法如下:
以下的实例主要参考【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())
同样,如果是放在了上级目录或者下级目录中,也可以使用上述方法,可以认为它是一种通用的方法。
当你看到这篇文章的时候,希望上述的内容能够对你有所帮助,当然,有什么错的地方,也请你提出来,我会多多改正。