進擊のpython
類&屬性
雖然我們上一part寫了一個面向對象的程序:人狗大戰
但是如果在面向對象來看
你這些的就不夠規范
你既然選擇用面向對象的思想來寫
那你就要符合人家的定義規范和操作流程
那廢話不多說
開始整活!
走的太快,就要停下來等等靈魂!
前面是先整出一個模板是吧?
那咱們也寫個模板!
按照面向對象的思想來寫!
那 類 是不是就是模板!(為啥要分兩個博客寫,就是為了讓你對照上一個來看的!)
那就涉及到知識盲區了吧!
class Dog: # python中,類的書寫首字母大寫,不寫只是不專業
d_kind = "jingba" # 狗(類)的屬性 (類變量)
def bite(self): # 函數(方法)(self 先把他當作默認變量)
print("我是狗,我的種類是", self.d_kind) # 先記住調用要用self來調用
d = Dog() # 狗(類)的實例化
d1 = Dog() # 狗(類)的實例化
d.bite() # 狗(類)的函數(方法) 實例化.方法
print(d.d_kind) # 狗(類)的屬性 實例化.屬性
可以不鐵汁!兩篇文章對照着來看,試着自己寫一下人的模板(類)
動手!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
別光看!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
class Person:
p_blod = 100
def beat(self):
print("我是人,我的血量是", self.p_blod)
但是我每個狗的名字不一樣,我也想寫進去,跟前面一樣
怎么辦嘛!
首先可以肯定,你不能把d_name這個屬性放到class
為什么???
因為class放的是共有屬性(大家都用的)
我這個dog做的就是jingba狗的模型
我要是加個名字“zhangsan”
那不就是做了一個都叫zhangsan的jingba狗了嗎?
那咋辦嘛!
我是不是應該考慮,把這個d_name屬性變成私有屬性呢?
會嗎???
你當然不會啊!
你會我寫啥啊!
這里我們用到了個新的好玩的東西
class Dog: # python中,類的書寫首字母大寫,不寫只是不專業
d_kind = "jingba" # 狗(類)的屬性 (類變量)
def __init__(self): # 初始化方法,構造方法,構造函數
def bite(self): # 函數(方法)(self 先把他當作默認變量)
print("我是狗,我的種類是", self.d_kind) # 先記住調用要用self來調用
看到中間的那個def __init__(self):沒有?
你要是非要糾結self以及為什么是用_來寫的,那就點這里!(傳送門)
點完回來了奧
那我們繼續!
def __init__(self):
這個東西是干什么的呢???
他會在你實例化的時候,自動執行,進行一些初始化操作
很重要!記下來!
那怎么用呢?????????
看代碼好不?
class Dog: # python中,類的書寫首字母大寫,不寫只是不專業
d_kind = "jingba" # 狗(類)的屬性 (類變量)
def __init__(self, name, age): # 初始化方法,構造方法,構造函數
print(f"我的名字是{name},我的年齡是{age}")
def bite(self): # 函數(方法)(self 先把他當作默認變量)
print("我是狗,我的種類是", self.d_kind) # 先記住調用要用self來調用
我們把想傳進去的參數都放到 def __init__(self): 這個里面
好,形參確定了!怎么傳實參呢?
實例化的時候就可以傳了!
d = Dog("ponny", 18)
打印沒有問題!
但是我又有個想法,我想這么寫!
def __init__(self, name, age):
print(f"我的名字是{name},我的年齡是{age}")
def bite(self):
print("我是狗,我的種類是", self.d_kind,name,age)
我想都打印出來,這么寫是不是應該可以
但是執行的時候是會報錯的
為什么呢?
最起碼,這也算是兩個函數是吧
當上面的函數執行結束之后
是不是數據就回收了?
我在下面調用是不是就沒了??
所以就會報錯是不!
那我要怎么把這個數據存起來呢????
這個時候就要講這個東西了 self
self什么意思??自己的吧
那他這個自己的是什么呢???
其實就是實例化本身!
還記得在上面,我們調用方法的時候是怎么調用的嗎?
d = Dog()
d.bite()
對吧,但是你發現這個bite函數是有默認值的啊!
是誰??self!對吧!
那我沒傳參數怎么沒報錯呢?(你是不是都沒想過這個問題?)
所以說,我們得到了個觀點,就是self=d
那d是什么???是不是實例化的對象???
所以!!!!!!self就是實例化的對象!!!!
講參數的時候說過,默認參數要是不傳參,就是默認值是吧!
所以!!!!!!!!!!!!!!!!!!!!!!!!!
d.bite() == d.bite(d)(這種寫法是錯誤的,理解為主!)
好!既然我們知道了 self 就是實例化本身
那我們想要給 zhangsan 狗(實例化)一些私有變量
是不是應該跟 zhangsan 狗綁定?(因為是他自己的屬性,所以要綁定啊)
是不是就應該像 zhangsan狗的年齡是18
那是不是就應該是 zhangsan狗.年齡 = 18
那是不是就是 實例化.age = 18
那是不是就是 sellf.age = 18
那我這個18 是不是每個狗不一樣
是不是應該放個形式參數?
是不是應該寫成 self.age = age
那最后是不是介樣嬸兒的
def __init__(self, name, age):
self.name = name
self.age = age
print(f"我的名字是{name},我的年齡是{age}")
# 因為是私有的屬性,所以放到__init__這個函數里
好了!放好了!!怎么拿出來呢????
很簡單,怎么放的怎么往出拿!
def bite(self):
print("我是狗,我的種類是", self.d_kind, self.name, self.age)
打印一下!不會報錯的!
那我又有問題了!
那我突然又整了個狗sir(實例化一個對象)
但是種類不是jinmao
是erha
我要怎么改呢?
d.d_kind = "erha"
打印一下??沒問題
但是有問題啊!
這個d_kind不是共有屬性嗎?
你改了這個狗sir,那別的狗(zhangsan)不也變了嗎?
(試着打印一些別的狗,看看種類是否發生了變化)
結果是沒有變!
emm???????
是這樣的!
當我執行 d.d_kind = "erha" 這個語句的時候
相當於給我這個狗sir創建了一個新的私有屬性
當私有屬性和共有屬性相同時,我們就選用私有屬性的值!
首先我們學會了,如何用面向對象的規則來寫代碼
類的使用咱們也有點意識了
共有屬性和私有屬性也知道都是啥了
怎么使用公共屬性,怎么調用方法也有點會了
還解決了這個 self 的問題
以此知道了怎么存儲私有屬性
怎么拿出來私有屬性
那這些東西啊,看,是解決不了的(大手子當我沒說)
多練!多打!
設計一個類Person,生成若干實例,在終端輸出如下信息
小明,10歲,男,上山去砍柴
小明,10歲,男,開車去東北
小明,10歲,男,最愛大保健
老李,90歲,男,上山去砍柴
老李,90歲,男,開車去東北
老李,90歲,男,最愛大保健
老張…
去練練,你的付出會有回報的