python類與方法
函式
# 定義函式
def printme( str ):
print (str);
return;
# 呼叫函式
printme("我要呼叫使用者自定義函式!");
printme("再次呼叫同一函式");
類的優點:
1、類物件是多型的:也就是多種形態,這意味著我們可以對不同的類物件使用同樣的操作方法,而不需要額外寫程式碼。 2、類的封裝:封裝之後,可以直接呼叫類的物件,來操作內部的一些類方法,不需要讓使用者看到程式碼工作的細節。 3、類的繼承:類可以從其它類或者元類中繼承它們的方法,直接使用。
類的定義
1、定義類
class Test: def name(self,name): self.name = name
一第行,語法是class 後面緊接著,類的名字,最後別忘記“冒號”,這樣來定義一個類。
類的名字,首字母,有一個不可文的規定,最好是大寫,這樣需要在程式碼中識別區分每個類。
第二行開始是類的方法,大家看到了,和函式非常相似,但是與普通函式不同的是,它的內部有一個“self”,引數,它的作用是對於物件自身的引用。
2、初始化物件
建立類時,可以定義一個特定的方法,名為__init__(),只要建立這個類的一個例項就會執行這個方法。可以向__init__()方法傳遞引數,這樣建立物件時就可以把屬性設定為你希望的值__init__()這個方法會在建立物件時完成初始化
class People: def __init__(self,name,age,sex): self.Name = name self.Age = age; self.Sex = sex; def speak(self): print ("my name"+self.Name) peo_1 = People("haha",24,"man") print(peo_1.Name) print(peo_1.Age) print("\n") peo_2 = People("hehe",20,"girl") print(peo_2.Name) print(peo_2.Age)
之前多次用到self這個形參類就好比是一張藍圖,使用一個類可以建立多個物件例項,speak()方法在被呼叫時,必須知道是哪個物件呼叫了它.
這裡self引數就會告訴方法是哪個物件來呼叫的.這稱為例項引用。
3、類的私有屬性
__private_attrs 兩個下劃線開頭,宣告該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs
4、靜態方法
也可以沒有self,即靜態方法,@staticmethod是指類中無需例項參與即可呼叫的方法(不需要self引數),在呼叫過程中,無需將類例項化,直接在類之後使用.號運算子呼叫方法。
class ClassA(object):
@staticmethod
def func_a():
print('Hello Python')
ClassA.func_a() #直接呼叫
ca = ClassA() #物件引用
ca.func_a()
5、classmethod (類方法)
在python中.類方法 @classmethod 是一個函式修飾符,它表示接下來的是一個類方法,而對於平常我們見到的則叫做例項方法。 類方法的第一個引數cls,而例項方法的第一個引數是self,表示該類的一個例項。
class ClassA(object):
@classmethod
def func_a(cls):
print(type(cls), cls)
if __name__ == '__main__':
ClassA.func_a()
ca = ClassA()
ca.func_a()
這裡還需要注意,如果存在類的繼承,那類方法獲取的類是類樹上最底層的類。
class BaseA(object):
@classmethod
def func_a(cls):
print(type(cls), cls)
class BaseB(object):
pass
class ClassA(BaseA, BaseB):
pass
ClassA.func_a()
6、例項方法.
除靜態方法與類方法外,類的其他方法都屬於例項方法。例項方法需要將類例項化後呼叫,如果使用類直接呼叫例項方法,需要顯式地將例項作為引數傳入。最左側傳入的引數self,是例項本身。
class ClassA(object):
def func_a(self): #只有一個引數是self,沒有別的引數,呼叫函式的時候直接呼叫print方法
# 使用例項呼叫例項方法
ca = ClassA()
ca.func_a()
# 如果使用類直接呼叫例項方法,需要顯式地將例項作為引數傳入
ClassA.func_a(ca)
繼承類定義
單繼承
class Person(object): # 定義一個父類
def talk(self): # 父類中的方法
print("person is talking....")
class Chinese(Person): # 定義一個子類, 繼承Person類
def walk(self): # 在子類中定義其自身的方法
print('is walking...')
c = Chinese()
c.talk() # 呼叫繼承的Person類的方法
c.walk() # 呼叫本身的方法
子類對父類方法的重寫 與 建構函式的繼承
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
self.weight = 'weight'
def talk(self):
print("person is talking....")
class Chinese(Person):
def __init__(self, name, age, language):
Person.__init__(self, name, age) #super(Chinese,self).__init__(name,age)
self.language = language
print(self.name, self.age, self.weight, self.language)
def talk(self): # 子類 重構方法
print('%s is speaking chinese' % self.name)
c = Chinese('bigberg', 22, 'Chinese')
c.talk()
還可以多重繼承
class sample(speaker,student):