1. 程式人生 > >Python_靜態屬性、類方法、靜態方法

Python_靜態屬性、類方法、靜態方法

python Python_靜態屬性、類方法、靜態方 Python靜態屬性 Python類方法 Python靜態方法

1.靜態屬性
我們知道類既有函數屬性又有數據屬性,實例只有數據屬性,我們在使用實例調用類的函數屬性並運行時,總要帶上函數後面的括號才能運行,不然總是調用函數的內存地址,如下圖所示:

技術分享圖片

問題:那麽我們如何能像調用數據屬性一樣調用函數屬性呢?

類中提供了@property關鍵字,可以看成@property是一個裝飾器,裝飾器的作用是調用類的函數屬性key值時,直接來運行該key值對應的函數。像是調用類的屬性一樣來直接調用並運行類的函數,具體操作如:
1.1加上@property關鍵字後,類的函數屬性的不同之處:

技術分享圖片

1.2加上@property關鍵字後,實例調用類的函數屬性:

技術分享圖片

註意,當類中的函數有其他參數時(非self),加上@property關鍵字會報錯,提示缺少必要的位置參數,猜想應該是裝飾的問題,可能需要自定義裝飾器才行。可以判斷,@property的作用是:直接運行被裝飾的函數,不能帶參數,表面上看就是在被裝飾的函數後面直接加括號。

該部分的代碼塊為:

import time
class Door():
    "門的類"
    address = "浙江省杭州市"
    def __init__(self,size,color,type):#構造函數
        "初始化門的數據"
        self.size = size
        self.color = color
        self.type = type
    @property
    def open(self):
        "門打開的方法"
        print("這個%s門打開了" %self.type)
    @property
    def off(self,time):
        "門關閉的方法"
        print("這個%s門關閉了,時間為;%s" %(self.type,time))
door1 = Door(16, ‘red‘, ‘木門‘)
#調用數據屬性
print(door1.size)
print(door1.address)
#調用函數屬性
# door1.open()    #函數後面的括號每次都必須要帶上
#實例調用類的靜態屬性
print(Door.__dict__)
door1.open
time1 = time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime())
# door1.off(time1)    #傳參無效,應該要自定義對應的裝飾器才行

2.類方法
如果要求,不進行實例化,直接調用類的函數,此時會提示缺少必要的位置參數self,如下圖:

技術分享圖片

我們加上位置參數後,如下圖:

技術分享圖片

雖然我們可以隨意加上位置參數,但是註意到此處的self有特殊含義,它是指實例的本身,也就是說要使用self必須要先實例化才行。為了解決這個問題,我們引入另一個@classmethod裝飾器後,就可以直接通過類來調用類的函數屬性了(該函數帶類的數據屬性參數),如下圖所示:

技術分享圖片

3.靜態方法
如果要求:在類中定義一個函數,要求該函數中的位置函數與實例無關,與所在的類本身也無關。為了解決該問題,現引入了@staticmethod,操作如下圖所示:

技術分享圖片

可以看出,雖然test方法與實例無關,與類本身也無關,但是卻可以通過實例和類來調用它,卻使用實例調用它是不會傳入實例本身的位置參數(在正常類方法中,實例化類後,實例在調用它時,會自動默認首先傳入實例本身即self)。

到了此處可能有人問,為什麽不能直接在類中定義一個函數,不傳self形參?按照上面的提議是否能滿足實例可以調用,類本身也可以調用的要求呢?詳見下圖:

技術分享圖片

我們可以看出,如果直接在類中定義一個常規方法(不含self的形參),通過類本身訪問它,但是通過實例來訪問它時雖然也是傳入2個參數,但是實際行python自動默認首位傳入了self,這樣就造成了上面的情況了(傳的是2個參數,收到的是3個參數)
該部分代碼塊如下:

class Door():
    "門的類"
    address = "浙江省杭州市"
    def __init__(self,size,color,type):#構造函數
        "初始化門的數據"
        self.size = size
        self.color = color
        self.type = type
    def open(self):
        "門打開的方法"
        print("這個%s門打開了" %self.type)
    def off(self,time):
        "門關閉的方法"
        print("這個%s門關閉了,時間為;%s" %(self.type,time))
    @staticmethod
    def test(x,y):
        print("%s,%s的乘積為:%s"%(x,y,x*y))

    def test1(x,y):
        print("%s,%s的乘積為:%s"%(x,y,x*y))

door1 = Door(16, ‘red‘, ‘木門‘)
#調用靜態方法test
Door.test(1,3)
door1.test(2,5)
#調用常規方法test1
Door.test1(1,3)
door1.test1(2,5)

註意:靜態方法中不能調類屬性和方法,也不能調用實例變量,只是類的工具包。因為沒有self,也就不能指類本身或實例本身,從而不能調用相應的類屬性和類方法。

Python_靜態屬性、類方法、靜態方法