天天看點

Python學習日記 Day11類與對象(下)

今天是2020年2月20日,晴,6~14℃

一、繼承

繼承是一種建立新類的方式。建立類将獲得原有類的所有屬性和方法。原有的類稱為父類(超類),建立的類稱為子類。

Python中繼承的方式如下:

'''
class ClassName(Base):
	<statement>
'''
class Person():		#父類
	'''Person類的屬性和方法'''

class Student(Person):		#子類
	'''Student類特有的屬性和方法'''
           

1、子類的 init 方法

建立子類執行個體時,首先需要建立出一個父類執行個體,為父類的屬性指派。是以父類中若不存在不需要參數的 Init 方法,則子類的 init 方法必須為父類的提供參數。

class Person():				#父類
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender
class Student(Person):		#子類
    def __init__(self,name,age,gender):
        super().__init__(name,age,gender)		#初始化父類
           

如上,在子類的 init 方法中調用了特殊的 super 函數,擷取父類,進而顯式調用父類的 init 方法。此外,super 函數還可以用于調用父類的屬性和方法。

2、定義子類的屬性和方法

讓一個類繼承另一個類後,可添加子類特有的屬性和方法。

class Student(Person):
	def __init__(self,name,age,gender,grade,stu_id):
        super().__init__(name,age,gender)		#初始化父類
        self.grade = grade			#特有屬性grade
        self.stu_id = stu_id		#特有屬性stu_id
    def print_stu_id(self):			#特有方法print_stu_id
    	print(self.stu_id)
           

你可以根據所需添加任意數量的屬性和方法。但注意,若一個屬性和方法是父類擁有的,應加入父類中;隻有當這個屬性和方法隻屬于子類時才加入子類中。

3、重寫父類方法

如果父類的方法不符合需求,就可對其進行重寫。為此,可在子類中定義一個方法,與要重寫的父類方法同名的。這樣,在程式運作時Python就不會考慮父類的方法,而使用子類的方法。

class Person():
	def print_info(self):		#原有方法
		print("Name: " + self.name)
		print("Gender: " + self.gender)
		print("Age: " + self.age)

class Student(Person):
	def print_info(self):		#重寫
		print("Studnet ID: " + self.stu_id)
		print("Grade: " + self.grade)
		print("Name: " + self.name)
		print("Gender: " + self.gender)
		print("Age: " + self.age)

person_1 = Person("Alex",18,"Male")
student_1 = Student("Alex",18,"Male",7,20200220)
print("This is a person:")
person_1.print_info()
print("This is a student:")
student_1.print_info()
'''
Output:
This is a person:
Name: Alex
Gender: Male
Age: 18
This is a student:
Studnet ID: 20200220
Grade: 7
Name: Alex
Gender: Male
Age: 18
'''
           
不同于C++中的重寫需要函數名,參數表和傳回類型均相同,Python中重寫隻要方法名相同。

4、以執行個體為屬性

當一個類内的屬性和方法過多時,可以将其中一部分作為另一個類提出,并将其作為大類的屬性。

class Battery():		#電池類
	def __init__(self,type_,size):
		self.type_ = type_
		self.size = size
	def print_type(self):
		print(self.type_)
	def print_size(self):
		print(self.size)

class Computer():		#電腦類
	def __init__(self,battery_type,battery_size,mouse_type,keyboard_type,screen_type):
		self.battery = Battery(battery_type,battery_size)		#電池執行個體作為電腦的屬性
		self.mouse_type = mouse_type
		self.keyboard_type = keyboard_type
		self.screen_type = screen_type
           

二、導入類

與函數類似,類也可以存入子產品中,然後在主程式中導入相應子產品。

1、建立子產品

在項目中建立一個名為person.py的的檔案,并加入類的定義。

#person.py
class Person():
	'''人類'''
    def __init__(self,name,age,gender):
    	'''	構造器'''
        self.name = name
        self.age = age
        self.gender = gender
    def print_info(self):
    	'''輸出人的資訊'''		
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))

class Student(Person):
	'''學生類'''
    def __init__(self,name,age,gender,grade,stu_id):
    	'''構造器'''
        super().__init__(name,age,gender)
        self.grade = grade
        self.stu_id =stu_id
    def print_info(self):	
    	'''輸出學生的資訊'''	
        print("Studnet ID: " + str(self.stu_id))
        print("Grade: " + str(self.grade))
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))
           

這樣,一個簡單的類子產品就完成了。

2、導入類

跟導入函數一樣,導入類也有多種方式,可以根據需要選用。

● 導入單個類
● 導入多個類
與導入函數相同,也可以使用 as 關鍵字為類指定别名。
● 導入所有類
以上三種方法均不需要使用句點表示法。
● 導入整個子產品
import person
           
這種導入方法很簡單,代碼也易于閱讀,不會與目前檔案使用的任何名稱發生沖突。

導入類的方式和導入函數基本一緻。同樣,導入類時也不推薦使用導入所有類的方法。一般來說,要麼導入整個子產品使用句點表示法,要麼導入需要的類和函數。

● 在子產品中導入子產品

有時候,需要将類分散到多個子產品中,以免子產品太大,或在同一個子產品中存儲不相關的類。将類存儲在多個子產品中時,你可能會發現一個子產品中的類依賴于另一個子產品中的類。 在這種情況下,可在前一個子產品中導入必要的類。

#person.py
class Person():
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender
    def print_info(self):		#原有方法
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))

           
#student.py
from person import Person
class Student(Person):
    def __init__(self,name,age,gender,grade,stu_id):
        super().__init__(name,age,gender)
        self.grade = grade
        self.stu_id =stu_id
    def print_info(self):		#重寫
        print("Studnet ID: " + str(self.stu_id))
        print("Grade: " + str(self.grade))
        print("Name: " + self.name)
        print("Gender: " + self.gender)
        print("Age: " + str(self.age))
           
#main.py
import student
person_1 = student.Person(...)
student_1 = student.Student(...)
           

在導入一個子產品後,也可以使用在這個子產品裡導入的子產品。調用的方式取決于子產品中導入子產品的方式和主程式中調用子產品的方式。

例如:若都導入整個子產品,則需要使用兩次句點表示法;若都導入指定類,就不需要句點表示法。

3、Python标準庫

在學習如何使用類和導入類後,可以開始使用Python自帶的标準庫了。Python标标準準庫庫 是一組子產品,安裝的Python都包含它。可使用标準庫中的任何函數和類,為此 隻需在程式開頭包含一條簡單的import 語句。

查詢标準庫:http://pymotw.com/ 或 https://docs.python.org/zh-cn/3/library/index.html

還可以從其他地方下載下傳外部子產品使用。

三、類編寫規範

1、類名應使用駝峰命名法,即每個單詞的開頭字母大寫。執行個體名和子產品名使用下劃線法。

2、對于每個類,都應在定義後緊跟一個文檔字元串,簡要闡述類的功能。

3、對于每個子產品,也應包含一個文檔字元串,介紹子產品内的類可做什麼。

4、在類中,可使用一個空行來分隔方法;而在子產品中,可使用兩個空行來分隔類。

5、需要同時導入标準庫中的子產品和你編寫的子產品時,先導入标準庫子產品的import 語句,再添加一個空行,然後導入你自己編寫的子產品的import 語句。