這樣的知識(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í)候容易讓人混淆,不知道你要干啥。