property特性
不能賦值,隱藏執(zhí)行一段代碼
class Foo:
def __init__(self,val):
self.__NAME=val #將所有的數(shù)據(jù)屬性都隱藏起來(lái)
@property
def name(self):
return self.__NAME #obj.name訪問(wèn)的是self.__NAME(這也是真實(shí)值的存放位置)
@name.setter
def name(self,value):
if not isinstance(value,str): #在設(shè)定值之前進(jìn)行類(lèi)型檢查
raise TypeError('%s must be str' %value)
self.__NAME=value #通過(guò)類(lèi)型檢查后,將值value存放到真實(shí)的位置self.__NAME
@name.deleter
def name(self):
raise TypeError('Can not delete')
f=Foo('egon')
print(f.name)
# f.name=10 #拋出異常'TypeError: 10 must be str'
del f.name #拋出異常'TypeError: Can not delete'
staticmethod 靜態(tài)方法
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)
print(c.year,c.month,c.day)
靜態(tài)方法本身可以作為一個(gè)函數(shù)提供給類(lèi),作為不同的初始化實(shí)例的方式
classmethod 類(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)
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__,但是結(jié)果為
'''
輸出結(jié)果:
<__main__.Date object at 0x1013f9d68>
'''
因?yàn)閑就是用Date類(lèi)產(chǎn)生的,所以根本不會(huì)觸發(fā)EuroDate.str,解決方法就是用classmethod
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
'''