Python類變量、實例變量與構造方法、實例方法、類方法和靜態方法

學習面向對象有一個關鍵就是封裝性,如果沒學自定義函數的就先看看自定義函數再來。

文章所有代碼都在.實例變量和類變量-SRC文件夾中,如果在博客中看的,可以去我的倉庫中查看代碼

實例變量和類變量-SRC——Repository

創建類

首先忘了講怎麼定義一個類,其實很簡單,示例如下:

# -*- coding: UTF-8 -*-
#!/usr/bin/env python3
# ch1_1.py
'''
author: Thomaslk
Create Date: 2020-05-25
note: 文章配套代碼,類的實例變量和類變量,附帶繼承
'''


class People(object):  # 定義一個People類,名字叫People
    typeof = 'People'  # 類變量,是所有實例共有的變量(這個類變量定義的有點不實際)

    def __init__(self, _sex, _age):  # 構造方法,就先來一個性別和年齡的構造
        self.sex = _sex  # 實例變量
        self.age = _age  # 實例變量
        #必須有self,這是給People這個自己構造,否則就可以只用類變量了



class Student(People):  # 繼承了People父類
    def __init__(self, _name, _SN):  # 這時候導入名字和學號
        self.name = _name
        self.Student_Number = _SN

    def PrintYourName(self):
        print("name is:{0}".format(self.name))



class THOMAS(Student):
    pass


cc = People('man', 11)
print("性別:{0}, 年齡:{1}".format(cc.sex, cc.age))
stu = Student('tom', 14)
print("名字:{0}, 學號:{1}".format(stu.name, stu.Student_Number))
stu.PrintYourName()

第一行的People類繼承了object這個大餅夾一切的超類,其實可以不用加object,也是自動繼承object

輸出就是:

性別:man, 年齡:11
名字:tom, 學號:14
name is:tom

類中變量——實例變量 和 類變量

實例變量

在類體中可以包含類的成員,其中包含成員變量成員方法屬性,成員變量又分爲實例變量類變量,成員方法又分爲實例方法類方法靜態方法。如圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DhiqV0dx-1590649488845)(E:\ProgramThomas\Coding-Notes\Python-Notes\第十一章_面向對象編程\1964702-20200525193632094-1230720429.png)]

“實例變量”就是某個實例(或對象)個體有的“數據”,例如你家狗的名字、年齡和性別 與 鄰居家的狗的“數據”是不同的。

Python中定義實例變量的代碼如下:

# -*- coding: UTF-8 -*-
#!/usr/bin/env python3
# ch1_2.py
'''
author: Thomaslk
Create Date: 2020-05-25
note: 文章配套代碼,定義實例變量
'''
class Animal(object):
    """定義動物類"""

    def __init__(self, _age, _sex, _weight): #爲了區分,將參數加下劃線
        self.age = _age
        self.sex = _sex
        self.weight = _weight

conn = Animal(2, 1, 10.0)
# 1是雄性,0是雌性
print('年齡:{0}'.format(conn.age))
print('性別:{0}'.format('雌性' if conn.sex == 0 else '雄性'))
print('體重:{0}'.format(conn.weight))

輸出的時候,判斷性別用了條件表達式,有關構造方法,完後看就知道了,至於cnnn創建的時候調用的參數也跟構造方法有關,下面再說。

輸出:

年齡:2
性別:雄性
體重:10.0

三行print語句就是輸出每一個傳入的值,使用**“實例名.實例變量”**的形式訪問

類變量

類變量是所有實例共有的變量,例如有一個Account(賬戶)類,它有三個成員變量:amount(賬戶金額)、interest_rate(利率)和owner(賬戶名)。在這三個成員變量中,amount和owner會因人而異,而interest_rate是相同的,amount和owner和賬戶個體有關,對應着每一個對象會不同,interest_rate與對象是什麼無關,換句話說就是所有對象共享,這種變量稱爲“類變量”

就以Account爲例,代碼如下:

# -*- coding: UTF-8 -*-
#!/usr/bin/env python3
# ch1_3.py
'''
author: Thomaslk
Create Date: 2020-05-25
note: 文章配套代碼,認識類變量
'''

class Account:
    """定義銀行賬戶類"""

    interest_rate = 0.0668 #類變量——利率

    def __init__(self, _owner, _amount):
        self.owner = _owner
        self.amount = _amount

act = Account('Tony', 1_800_000.0)

#自己輸出驗證吧

其中的interest_rate是類變量,不管是act,還是什麼名稱,interest_rate都是自帶的,是0.0668。

訪問方法:實例變量是使用實例名.實例變量的形式訪問的,類變量是通過類名.類變量訪問的

__dict__魔法方法

可以使用__dict__魔法方法來查看一個類中的實例變量和其值,沒有類變量

print('act的所有變量:{0}'.format(account.__dict__))

類中函數——構造方法、實例方法、類方法 和 靜態方法

構造方法——__init__

前面的程序中已經出現了構造方法__init__(),該方法用來創建初始化實例變量,只在開始時執行一次,這種方法就是構造方法。此方法也屬於魔法方法,這個方法的第一個參數應該是self參數,其後纔是初始化實例變量的參數,調用時不需要傳入self,self就是本身(此實例),所以不需要 傳入。

實例代碼:

#!/usr/bin/env python3
# ch1_4.py
'''
author: Thomaslk
Create Date: 2020-05-25
note: 文章配套代碼,認識構造方法
'''

class Animal(object):
    def __init__(self, age, sex = 1, weight = 0.0):
        self.age = age
        self.sex = sex
        self.weight = weight
a1 = Animal(2, 0, 10.0)
a2 = Animal(1, weight=5.0)
a3 = Animal(1, sex=0)

實例方法——self中

實例方法與實例變量都是某個實例(對象)個體特有的,實例方法的第一個參數也是self,這是特點,其意思就是將當前實例與該方法綁定起來,成爲方法,比如list.sort()是列表的方法,就是一個實例方法

實例:

#!/usr/bin/env python3
# ch1_5.py
'''
author: Thomaslk
Create Date: 2020-05-25
note: 文章配套代碼,認識實例方法
'''

class shell(object):
    def clear(self):
        pass
    def delete(self):
        pass
    def help(self):
        pass
    def out(self):
        print("hello world")


ps = shell()
ps.out()

其中四個方法都是實例方法

類方法——不需要綁定

“類方法”和“類變量”類似屬於類,不屬於個體實例的方法,類方法不需要與實例綁定,但需要與類綁定,定義時它的第一個參數不是self,而是類的type實例。type是描述python數據類型的類,python中所有數據都是type類的一個實例。

實例:

#!/usr/bin/env python3
# ch1_6.py
'''
author: Thomaslk
Create Date: 2020-05-25
note: 文章配套代碼,認識類方法
'''

class Account:

    interest_rate = 0.0668

    def __init__(self, _owner, _amount):
        self.owner = _owner
        self.amout = _amount
    
    #類方法
    @classmethod
    def interest_by(cls, amt):
        return cls.interest_rate * amt

cls參數是type類型,是當前Account類型的實例

提示:裝飾器(Decorators)是Python3x之後加入的新特性,以@開頭修飾函數、方法和類,用來修飾和約數它們,類似於Java中的註解。

調用類方法使用類名.類方法形式調用

靜態方法——@staticmethod

如果定義的方法既不想與類綁定,只是想把類作爲它的命名空間,那麼可以定義靜態方法。

實例:

#!/usr/bin/env python3
# ch1_7.py
'''
author: Thomaslk
Create Date: 2020-05-25
note: 文章配套代碼,認識類方法
'''


class Account:

    interest_rate = 0.0668

    def __init__(self, _owner, _amount):
        self.owner = _owner
        self.amout = _amount

    #類方法
    @classmethod
    def interest_by(cls, amt):
        return cls.interest_rate * amt
    @staticmethod
    def interest_with(amt):
        return Account.interest_by(amt)

#輸出自己試

靜態方法不需要cls參數和self參數,使用了@staticmethod裝飾器,聲明方法是靜態方法。

一起加油!這一章結束了!🚀

您可能發現了文章中有一些錯誤,歡迎提出!🚀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章