Python 3 學習筆記之——面向物件
類(Class)用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項,類是物件的抽象。
- 方法 :類中定義的函式。
- 類變數 :類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。
- 方法變數 :定義在方法中的變數。
- 繼承 :即一個派生類(derived class)繼承基類(base class)的屬性和方法。
- 方法重寫 :如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也成為方法的重寫。
2. 類的定義
語法格式如下:
class ClassName: <statement-1> . . . <statement-N> 複製程式碼
-
類有一個名為 _ init _() 的特殊方法,也即是 建構函式 ,該方法會在定義物件的時候自動呼叫,可以通過引數傳遞來對類的例項進行設定。
-
在類內部,使用 def 關鍵字來定義一個方法,與一般函式不同,類方法必須包含引數 self ,並且作為第一個引數, self 代表類的例項,類似於 C++ 中的 this 指標。
-
類的私有屬性 __private_attrs 以兩個下劃線開頭,在類內部的方法中使用時用 self.__private_attrs 呼叫,不能在類外部訪問類的私有屬性。
-
類的私有方法 __private_method 以兩個下劃線開頭,只能在類的內部呼叫,不能在類外部呼叫。
class person: instances = 0# 類變數,所有類公用 def __init__(self, name, age, weight): self.name = name# 公有屬性 self.age = age self.__weight = weight# 私有屬性,在類外無法直接訪問 person.instances += 1;# 通過類來訪問類變數 def tell_a_secret(self):# 私有方法 print("Tell you a secret, my weight is {} kg.".format(self.__weight)) def speak(self):# 公有方法 print('My name is {}, I\'m {} years old.'.format(self.name, self.age)) self.tell_a_secret() people = person('seniusen', 21, 60) people.speak() print(people.instances) print(people.instances) # 通過例項也可以訪問類變數 # My name is seniusen, I'm 21 years old. # Tell you a secret, my weight is 60 kg. # 1 # 1 複製程式碼
3. 類的單繼承
語法格式如下:
class DerivedClassName(BaseClassName1): <statement-1> . . . <statement-N> 複製程式碼
-
注意圓括號中基類的順序,若是基類中有相同的方法名,而在子類使用時未指定,則 Python 從左至右進行搜尋。即 方法在子類中未找到時,從左到右查詢基類中是否包含該方法 。
-
基類名 BaseClassName 必須與派生類定義在一個作用域,如果基類定義在另一個模組,這時候我們還可以用一個表示式來定義派生類,
class DerivedClassName(modname.BaseClassName):
。
class student(person): def __init__(self, name, age, weight, major): person.__init__(self, name, age, weight) # 呼叫父類的建構函式,此時必須給定 self 引數 # super(student, self).__init__(name, age, weight) 或者利用 super() 函式 self.major = major # 重寫父類的方法 def speak(self): # 公有方法 person.speak(self) print('My major in college is {}.'.format(self.major)) stu = student('seniusen', 21, 60, 'Automation') stu.speak() print(student.instances) print(stu.instances) # 通過例項也可以訪問類變數 # My name is seniusen, I'm 21 years old. # Tell you a secret, my weight is 60 kg. # My major in college is Automation. # 2 # 2 複製程式碼
3. 類的多繼承
語法格式如下:
class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N> 複製程式碼
class teacher: def __init__(self, title, topic): self.title = title self.topic = topic def speak(self): # 公有方法 print('I\'m a {} , my research topic is {}.'.format(self.title, self.topic)) # 繼承自 teacher 和 student 的子類 class sample(teacher, student): def __init__(self, name, age, weight, major, title, topic): student.__init__(self, name, age, weight, major) teacher.__init__(self, title, topic) test = sample('seniusen', 21, 60, 'Automation', 'prefessor', 'CV') test.speak() # 沒有指定方法,從左到右查詢,這裡呼叫了 teacher 類的 speak() 方法 # I'm a prefessor , my research topic is CV. 複製程式碼
- 利用 super() 函式可以呼叫被子類重寫的父類中的方法。
class Parent:# 定義父類 def myMethod(self): print ('Method form Parent class!') class Child(Parent):# 定義子類 def myMethod(self): print ('Method form Child class!') a = Child()# 子類例項 a.myMethod()# 子類呼叫重寫方法 super(Child, a).myMethod() #用子類物件呼叫父類已被覆蓋的方法 # Method form Child class! # Method form Parent class! 複製程式碼
參考資料菜鳥教程
獲取更多精彩,請關注「seniusen」!
