1. 類的介紹
類(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」!