一、class的定義及常用稱呼
本節參考的博客
https://blog.csdn.net/pdstar/article/details/90900944
類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。
對象:它是類的實例化。
方法:指類中定義的函數。
類對象支持兩種操作:屬性引用 和 實例化。
(1)屬性引用的語法:obj.屬性
(2) 類實例化的語法:obj = 類名()
(3) 類中方法的調用:obj.方法名()
下面舉例兩種常用方法:
class student(object): #自定義一個類student
def speak(self): ## 哪個對象調用了這個方法,self就是那個對象;可以把self理解爲一個形參
print("%s 說:我今年%s歲" % (self.name, self.age))
john = student() #類student 實例化一個對象john
john.name = "約翰" # 給對象添加屬性
john.age = 19
john.speak() # 調用類中的 speak()方法
此時的輸出爲
約翰 說:我今年19歲
來看第二個例子:
class student(object): # 定義構造方法 有init,有別於自定義類
def __init__(self, n, a): #__init__() 是類的初始化方法;它在類的實例化操作後 會自動調用,不需要手動調用;
self.name = n
self.age = a # 設置屬性
def speak(self): # 定義類中的普通方法
print("%s 說:我今年%s歲" % (self.name, self.age))
john = student("約翰",19) #類student 實例化一個對象john
john.speak() # 調用類中的 speak()方法
最後的輸出同上個例子
在python中使用__開頭 並以__結尾的方法,稱之爲魔法方法;
init(self) 是類的初始化方法,也稱構造方法,是一種特殊的魔法方法; init(self)在實例化後,會自動調用,而不用手動調用,所以一般把屬性設置在_init__()裏;
常用到的魔法方法還有:str(self) 、 del(self)等。
二、 類的繼承以及super,self的使用
用簡單的一句話來理解:繼承,這樣理解就對了,你的就是我的,但是我的還是我的,但是你有我也有的,我就不稀罕你的,所以調用了父類的時候,self就是我,而不是你
此處參考的博客
https://www.jb51.net/article/163991.htm
https://blog.csdn.net/abcgkj/article/details/100188183?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
1. 子類繼承父類,即子類擁有了父類的屬性和方法。
python中類的初始化都是__init__()。所以父類和子類的初始化方式都是__init__()
但是如果子類初始化時沒有這個函數,那麼它便調用父類的__init__();(對應例input1)
如果子類種調用了父類的init,但自己又定義了自己的init,那麼就會覆蓋父類的初始化函數,只顯示子類自己的初始化。(對應例input2)
input1:
class Animal(object):
def __init__(self):
self.name = "我是父類"
class Panda(Animal):
def __init__(self):
super().__init__() #使用super的方式來顯示調用父類的__init__()函數
super(Panda, self).__init__() # 第二種super初始化的方式
if __name__=="__main__":
panda = Panda() #實例化Panda
print(panda.name)
output1:
我是父類
input2:
class Animal(object):
def __init__(self):
self.name = "我是父類"
class Panda(Animal):
def __init__(self):
super().__init__()
self.name = "panda"
if __name__=="__main__":
panda = Panda()
print(panda.name)
output2:
panda
2. self和super的區別:
(1) self是首先調用自身的方法如果自身沒有再去父類中找;super是直接從父類中找方法
(2)self是類(可以理解爲形參),super是預編譯指令
反正要繼承父類,直接上super就ok了
input3:
class Animal(object):
def __init__(self):
self.name = "我是父類"
def A(self): #父類中的A方法
print("父類的A方法")
class Panda(Animal):
def __init__(self):
super().__init__()
self.myname = "panda"
def A(self): #子類中的A方法
print("子類的A方法")
def B(self):
self.A() #self調用A
super().A() #super調用A
if __name__=="__main__":
panda = Panda()
panda.B() #通過B函數來調用A方法,查看self和super的區別
output3:
子類的A方法 #我們說過self是先從自身找方法,沒有再去父類找
父類的A方法 #而super則是直接從父類中找