python中特性(property)、靜態(tài)方法(staticmethod)、類(lèi)方法(classmethod)的用法

這樣的知識(shí)講解,在網(wǎng)上應(yīng)該有很多,我記下來(lái)的目的,是為了記下此時(shí)對(duì)他們的理解,方便后續(xù)查看

property

在類(lèi)中,用property修飾的方法,可以當(dāng)成一個(gè)變量被調(diào)用??此剖钦{(diào)用了一個(gè)變量,其實(shí)是走了一個(gè)函數(shù)。
遵循了統(tǒng)一訪問(wèn)的原則。

 1 class Foo:
 2     def __init__(self,val):
 3         self.__NAME=val #將所有的數(shù)據(jù)屬性都隱藏起來(lái)
 4 
 5     @property
 6     def name(self):
 7         return self.__NAME #obj.name訪問(wèn)的是self.__NAME(這也是真實(shí)值的存放位置)
 8 
 9     @name.setter
10     def name(self,value):
11         if not isinstance(value,str):  #在設(shè)定值之前進(jìn)行類(lèi)型檢查
12             raise TypeError('%s must be str' %value)
13         self.__NAME=value #通過(guò)類(lèi)型檢查后,將值value存放到真實(shí)的位置self.__NAME
14 
15     @name.deleter
16     def name(self):
17         raise TypeError('Can not delete')
18 
19 f=Foo('egon')
20 print(f.name)
21 # f.name=10 #拋出異常'TypeError: 10 must be str'
22 del f.name #拋出異常'TypeError: Can not delete'

靜態(tài)方法

應(yīng)用場(chǎng)景:
編寫(xiě)類(lèi)時(shí)需要采用很多不同的方式來(lái)創(chuàng)建實(shí)例,而我們只有一個(gè)init函數(shù),此時(shí)靜態(tài)方法就派上用場(chǎng)了。
我的理解是,在靜態(tài)方法中需要對(duì)類(lèi)實(shí)例化時(shí),才會(huì)用到。

class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    @staticmethod
    def now(): #用Date.now()的形式去產(chǎn)生實(shí)例,該實(shí)例用的是當(dāng)前時(shí)間
        t=time.localtime() #獲取結(jié)構(gòu)化的時(shí)間格式
        return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建實(shí)例并且返回
    @staticmethod
    def tomorrow():#用Date.tomorrow()的形式去產(chǎn)生實(shí)例,該實(shí)例用的是明天的時(shí)間
        t=time.localtime(time.time()+86400)
        return Date(t.tm_year,t.tm_mon,t.tm_mday)

a=Date('1987',11,27) #自己定義時(shí)間
b=Date.now() #采用當(dāng)前時(shí)間
c=Date.tomorrow() #采用明天的時(shí)間

print(a.year,a.month,a.day)
print(b.year,b.month,b.day)

類(lèi)方法

應(yīng)用場(chǎng)景:
在基類(lèi)中方法反映的子類(lèi)某些特性時(shí),可以把此方法定義成類(lèi)方法。因?yàn)轭?lèi)方法第一個(gè)參數(shù)就是當(dāng)前類(lèi)。

import time
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    # @staticmethod
    # def now():
    #     t=time.localtime()
    #     return Date(t.tm_year,t.tm_mon,t.tm_mday)

    @classmethod #改成類(lèi)方法
    def now(cls):
        t=time.localtime()
        return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪個(gè)類(lèi)來(lái)調(diào)用,即用哪個(gè)類(lèi)cls來(lái)實(shí)例化

class EuroDate(Date):
    def __str__(self):
        return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)

e=EuroDate.now()
print(e) #我們的意圖是想觸發(fā)EuroDate.__str__,此時(shí)e就是由EuroDate產(chǎn)生的,所以會(huì)如我們所愿
'''
輸出結(jié)果:
year:2017 month:3 day:3
'''

強(qiáng)調(diào),注意注意注意:靜態(tài)方法和類(lèi)方法雖然是給類(lèi)準(zhǔn)備的,但是如果實(shí)例去用,也是可以用的,只不過(guò)實(shí)例去調(diào)用的時(shí)候容易讓人混淆,不知道你要干啥。

參考:https://www.cnblogs.com/wangyongsong/p/6750454.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容