7、__setitem__, __getitem__, __delitem__ |
當咱們對類的屬性item進行下標的操做時,首先會被__getitem__()、__setitem__()、__delitem__()攔截,從而進行咱們在方法中設定的操做,如賦值,修改內容,刪除內容等等。ide
__getitem__(self,key):返回鍵對應的值
__setitem__(self,key,value):設置給定鍵的值
__delitem__(self,key):刪除給定鍵對應的元素函數
class Foo: def __init__(self, name): self.name = name def __getitem__(self, item): # print('getitem...') #print(item) return self.__dict__.get(item) # 字典get方法有則取值,無也不會報錯 def __setitem__(self, key, value): # print('setitem...') # print(key,value) self.__dict__[key] = value def __delitem__(self, key): # print('delitem...') # print(key) # self.__dict__.pop(key) del self.__dict__[key] obj = Foo('egon') # 一、查看屬性 # obj.屬性名 # item系列就是爲了把對象模擬成像字典同樣,就能夠像字典同樣訪問 obj['name'] # 以這種形式完成 obj.name取值的效果 """ getitem... name """ print(obj['name']) # 二、設置屬性 # obj.sex = 'male' obj['sex'] = 'male' print(obj.__dict__) print(obj.sex) # 三、刪除屬性 # del obj.name del obj['name'] print(obj.__dict__) """ {'sex': 'male'} """
8、__str__, __repr__, __format__ |
改變對象的字符串顯示__str__,__repr__
自定製格式化字符串__format__spa
d = dict({'name' : 'egon'}) print(isinstance(d, dict)) # True,d是dict類的實例 print(d) class Foo: pass obj = Foo() print(obj) """ 一樣是打印對象,顯示形式徹底不一樣,打印老是但願像前一種有提示功能。 {'name': 'egon'} <__main__.Foo object at 0x10401ad68> """ # __str__方法定義後,會在打印對象的時候,觸發這個對象下的__str__方法,把字符串的結果做爲打印的結果 class People: def __init__(self, name, age): self.name = name self.age = age def __str__(self): # 必須return一個字符串 # print("觸發__str__方法:") return '<name:%s,age:%s>' %(self.name, self.age) obj = People('egon', 18) print(obj) """ <name:egon,age:18> """
format_dict={ 'nat':'{obj.name}-{obj.addr}-{obj.type}',#學校名-學校地址-學校類型 'tna':'{obj.type}:{obj.name}:{obj.addr}',#學校類型:學校名:學校地址 'tan':'{obj.type}/{obj.addr}/{obj.name}',#學校類型/學校地址/學校名 } class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __repr__(self): return 'School(%s,%s)' %(self.name,self.addr) def __str__(self): return '(%s,%s)' %(self.name,self.addr) def __format__(self, format_spec): # if format_spec if not format_spec or format_spec not in format_dict: format_spec='nat' fmt=format_dict[format_spec] return fmt.format(obj=self) s1=School('oldboy1','北京','私立') print('from repr: ',repr(s1)) print('from str: ',str(s1)) print(s1) ''' str函數或者print函數--->obj.__str__() repr或者交互式解釋器--->obj.__repr__() 若是__str__沒有被定義,那麼就會使用__repr__來代替輸出 注意:這倆方法的返回值必須是字符串,不然拋出異常 ''' print(format(s1,'nat')) print(format(s1,'tna')) print(format(s1,'tan')) print(format(s1,'asfdasdffd'))
date_dic={ 'ymd':'{0.year}:{0.month}:{0.day}', 'dmy':'{0.day}/{0.month}/{0.year}', 'mdy':'{0.month}-{0.day}-{0.year}', } class Date: def __init__(self,year,month,day): self.year=year self.month=month self.day=day def __format__(self, format_spec): if not format_spec or format_spec not in date_dic: format_spec='ymd' fmt=date_dic[format_spec] return fmt.format(self) d1=Date(2016,12,29) print(format(d1)) print('{:mdy}'.format(d1))
class A: pass class B(A): pass print(issubclass(B,A)) #B是A的子類,返回True a1=A() print(isinstance(a1,A)) #a1是A的實例
9、slots |