~~核心編程(二):面向對象——類&屬性~~


進擊の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歲,男,最愛大保健

老張…

去練練,你的付出會有回報的


*走的太快,就要停下來等等靈魂!*
*學的太快,就要停下來慢慢復習!*


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM