1.概念(有基礎可直接跳過)
類 Class
: 用來描述具體相同的屬性和方法的對象的集合。定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
對象
:類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
類變量
:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用。
類方法
:類中定義的函數。
數據成員
:類變量或者實例變量用於處理類及其實例對象的相關數據。
方法重寫
:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
實例變量
:定義在方法中的變量,只作用於當前實例的類。
繼承
:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作爲一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬”是一個(is-a)”關係(例圖,Dog是一個Animal)。
實例化
:創建一個類的實例,類的具體對象。就是將創建的類賦值給另一個變量。理解爲賦值即可,a = class(),這個過程,就叫做實例化
2.類的定義
python所有的類都是Object的子類,定義如下(方括號沒有意義,只是說明此處應該被替換成你自己的名字):
class [ClassName]([SuperClass1],[SuperClass2],......): #括號中爲父類
[VariableName1] #公有類變量
_[VariablName2] #保護類變量
__[VariableName3] #私有類變量
def [FunctionName](self): #公有實例成員方法
self.[VariableName] #公有實例成員變量
self._[VariableName] #保護實例成員變量
self.__[VariableName] #私有實例成員變量
def _[FunctionName](self): #保護實例成員方法
pass
def __[FunctionName](self): #私有實例成員方法
pass
@classmethod
def [FunctionName](cls): #類成員方法
pass
@staticmethod
def [FunctionName](): #靜態成員方法
pass
3.成員權限
python類中無論是成員變量還是成員方法,統一稱爲成員。
python中沒有像java那種明確的關於變量和方法權限的定義(private、protected、缺省、public),所有的成員都是公有屬性。
成員前面加上一個下劃線只是一種聲明,仍然可以通過類或對象直接訪問(.);
成員前面加上兩個下劃線,編譯執行時會自動在成員名前加上“_ClassName”,即全稱爲“_ClassName__VariableName”或者“_ClassName__FunctionName”,如果知道這個機制,仍然可以直接訪問。
4.不同變量的區別
類成員變量:在類中、類成員函數外定義的變量,屬於類,可以通過“類名.類成員變量”和“實例.類成員變量”來直接訪問。
實例成員變量:在類成員函數中使用“self.實例成員變量”定義的變量,屬於實例,只能通過“實例.實例成員變量”來訪問。
當實例成員變量和類成員變量重名時,使用實例訪問變量優先實例成員變量,使用類訪問變量優先類成員變量。
class Student:
name = 'man' #成員變量
def __init__(self):
self.name = 'AIRCode' #實例變量
if __name__ == '__main__':
s = Student()
print(s.name)
print(Student.name)
運行結果:
AIRCode
man
5.不同方法的區別
實例成員方法:類中直接聲明的方法,第一個參數必須是本對象(self只是變量名,可以自定義),方法中可以訪問所有變量,可以通過“實例.實例成員方法”調用。
類成員方法:類中被@classmethod修飾的方法,第一個參數必須是本類(cls只是變量名,可以自動義),方法中只能訪問類變量,可以通過“實例.類成員方法”、“類.類成員方法”調用。
靜態成員方法:類中被@staticmethod修飾的方法,參數自定義,方法不能訪問實例變量,只能通過"__class__.類成員變量"的方式訪問類成員變量(__class__是在object中定義的類成員變量),可以通過“實例.類成員方法”、“類.類成員方法”調用。
當三種方法名稱相同時,順序爲:靜態成員方法-->類成員方法-->實例成員方法
class Student:
def say(self):
print("My name is {0}.".format("object"))
@classmethod
def csay(cls):
print("My name is {0}.".format("class"))
@staticmethod
def ssay():
print("My name is {0}.".format("static"))
if __name__ == '__main__':
s = Student()
s.say()
Student.csay()
Student.ssay()
運行結果:
My name is object.
My name is class.
My name is static.