面向對象編程是最有效的軟件編寫方法之一。在面向對象編程中,你編寫表示現實世界中的事物和情境的類,並基於這些類來創建對象。編寫類時,你定義一大類對象都有的通用行為。基於類創建對象時,每個對象都自動具備這種通用行為,然后可根據需要賦予每個對象獨特的個性。使用面向對象編程可模擬現實情境。
關於類的創建、使用、繼承和導入,具體方法如下:
以下的實例主要參考【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())
同樣,如果是放在了上級目錄或者下級目錄中,也可以使用上述方法,可以認為它是一種通用的方法。
當你看到這篇文章的時候,希望上述的內容能夠對你有所幫助,當然,有什么錯的地方,也請你提出來,我會多多改正。