#Python3中類Class和物件obje
Python3中類Class和物件obje
類 是什麼
類是一個抽象的概念,泛指很多相似的個體組成的,具有共同特徵的事物。 比如類是一個車
,這車就包括各種車型
什麼是物件
類裡面的具體的一個事物。 比如 五菱神車S(過彎秒掉GTR的梗還記憶猶新) ,他是車這個類的具體化,
先有類,才有物件
理解類和物件
def eating():
print("吃草")
def walking():
print("走路")
eating()
walking()
#(輸出) 吃飯
走路
#這樣的話,別人也可以呼叫你寫的函式,但是呼叫eating() 並不能清除的瞭解到到底是誰 “吃飯”,
#所以我們輸入一個name來明確是誰在吃草。
def eating (name):
print(name,"吃飯")
eating("zhuozi") #呼叫函式
#(輸出)zhuozi 吃草
#但是你會發現 zhuozi用來吃飯,從邏輯上來說是否有點不妥,雖然他語法上沒問題,
#所以我們將進行一個歸類,將“吃飯”的一類 分為一類,也就是類別,所以我們將它進行標記,class Person:
#為什麼P大寫是用來和Python內建函式的類作區別,內建的類名都是小寫字母(可以ctrl + 滑鼠左鍵點選內建函式檢視)
class Person: #這樣我們就將eating封裝到了Person這個類裡面
#只要是Person這一類別的都可以進行下面的行為(eating)
def eating (name):
print(name,"吃飯")
zhangsan = Person() #這裡就不能像以前一樣用eating去呼叫了,因為只有Person這一類的才能就行eating這個行為
#所以我們就要先將zhansan定義為Person這一類
zhangsan.eating() #然後才能讓張三進行吃草這種行為
#(輸出)<__main__.Person object at 0x000001D2CCC21160> 吃飯
lisi = Person() #lisi也要吃飯,那繼續定義lisi 是person 類 他可以吃飯
lisi.eating () #lisi就可以吃飯了
#(輸出)<__main__.Person object at 0x000001BCC6BF1198> 吃飯
#列印的一個地址,一個類的地址 object(翻譯就是物件)就表示 lisi是這個類的物件
#lisi 就是 Person這個類 例項化的物件。
之前我們 def eating(name):的name 就是可以看做誰進行 eating ,而這裡語法的硬性要求就是用self 來代表到底是誰來呼叫 eating。所以如下:
class Person:
def eating(self):
print(self,"吃飯")
class Person:
pass
========
list 這裡我們ctrl + 滑鼠左鍵點選pycharm 裡面書寫的list,如圖:
可以看出內建的函式的類名都是小寫的,而以前我們用的類 (列表名).append() 也就是我們現在講的類下面的函式的呼叫,括號裡面的就是物件名self 而列表名就是例項化的物件。
語法
class 類名(父類列表): #類名和變數名稱的命名是一樣的,類名首字母要大寫,
#用來區別是否是內建函式自帶的類
類體
資料屬性 #類的共同屬性,名字,性別,幹什麼的,等等
方法屬性 #這個類共同都有的功能,跑,跳,計算,記錄等等
class Person:
pass
zhangsan = Person() #張三是Person例項化的物件,所以要開闢一個記憶體來儲存,
#即將zhangsan變數名指向這個記憶體地址
print(zhangsan)
#(輸出)<__main__.Person object at 0x00000194D8D28400>
既然例項化物件後開闢了記憶體,我們就要在裡面進行一個儲存
class Person:
pass
zhangsan = Person()
zhangsan.name = "zhangsan" #給這個例項化的物件附一個名字
print(zhangsan)
#(輸出)<__main__.Person object at 0x0000018DF6598400>
print(zhangsan.name) #打印出這個物件的名字
#(輸出)zhangsan
zhangsan物件名 指向 記憶體,記憶體裡面有一個屬性name,而name指向zhangsan這個名字 兩個zhngsan 不一樣啊
zhangsan(類的物件名字) -- 》記憶體 (name)----》zhangsan(物件的屬性)
lisi = Person() #再例項化一個物件
lisi.name = "xiaolong"
print(lisi.name)
print(id(lisi.name))
lisi = Person()
lisi.name = "xiaolong"
print(id(zhangsan))
#(輸出)2070146453856
print(lisi.name)
#(輸出)xiaolong
print(id(lisi.name))
#(輸出)2070146521264
可以看出兩個例項化的物件的id是不同的
這裡就引出了名稱空間規則:
每例項化出來一個物件,如果沒進行特別的處理的話都會佔用系統單獨的記憶體儲存。
class Person:
pass
zhangsan = Person()
zhangsan.name = "zhangsan"
zhangsan.sex = "男"
zhangsan.age = 19
zhangsan.hight = 175
lisi = Person()
lisi .name = "xiaolong"
lisi .sex = "女"
lisi .age = 29
lisi .hight = 170
#兩個內容的建立方式相同啊,只是內容不同,那麼我們寫一個函式來進行這種重複性的操作,
class Person:
def __init__(self, name, sex, age, hight):
self.name = name zhangsan.name = name
self.sex = sex zhangsan.name = sex
self.age = age zhangsan.name = age
self.hight = hight zhangsan.name = hight
#self 是為了規範明確是誰呼叫了,所以相當於將zhangsan這個物件傳給了self。
#而後面self之後的name, sex, age, hight 就是所要傳入的"zhangsan" "男"19 175 資訊
#zhangsan = Person()
#zhangsan.name = "zhangsan"
#zhangsan.sex = "男"
#zhangsan.age = 19
#zhangsan.hight = 175
這樣我們就不用再像上面一樣傳入了
zhangsan = Person("zhangsan","男","19",175)
print(zhangsan.name)
#(輸出)zhangsan
init:是系統所存在的特殊函式,當我們例項化物件的時候(zhangsan = Person(“zhangsan”,“男”,“19”,175)),預設例項化物件進行呼叫這個函式。 def init(self, name, sex, age, hight):
self物件名為 等號 前面的zhangsan,
而name, sex, age, hight 對應"zhangsan",“男”,“19”,175