1. 程式人生 > >python新式類

python新式類

#-*-coding:utf-8-*-
'''
_slots_類屬性
1._slots_是一個類變數,可以由一系列物件組成,使用所有合法標識構成的例項屬性的集合表示,它也可以是一個列表,元組,或可迭代物件,總之,任何試圖建立一個
其名不在_slots_中的例項屬性的操作都將引發AttributeError異常
'''
class MyLimeter(object):
#MyLimeter是以object類為超類的。在__slots__類屬性中,定義3個屬性'myname','myage','myhoppy'
__slots__ = 'myname','myage','myhoppy'
# if __name__ =='__main__':
# #建立類例項
# x = MyLimeter()
# #呼叫屬性,由於在例項屬性被引用前必須賦值,所以會報錯
# # x.myname
# #給屬性賦值,__slots__類屬性會防止使用者隨心所欲地動態新增例項屬性,所以會報錯
# # x.job = '白領'
# #修改程式碼
# x.myname = 'duochunyuan'
# print(x.myname)


'''
__getattribute__()特殊方法(只適用於新式類)
當屬性不能再例項的__dict__,類的__dict__或者__dict__中找到時才被呼叫
適用情況:想要一個適當的函式來執行對每個屬性的訪問,而不僅僅是屬性找不到的情況,這就需要使用__getattribute__()方法
程式碼描述:當例項物件myattribute訪問屬性member時,呼叫__getattribute__方法,並且判斷該屬性是否為test,很顯然不是,則執行else程式碼塊。由於屬性member
在類MyAttribute中存在,因此沒有呼叫__getattr__方法中的內容。當例項物件myattribute訪問屬性so時,又一次呼叫__getattribute__方法,進入__getattribute__
方法後進行判斷並且執行相應的程式碼,由於屬性so在MyAttribute類中不存在,因此呼叫__getattr__方法。在__getattr__方法中,當執行到self.default時,又呼叫
了一次__getattribute__方法,接著再次判斷,並且執行else塊中的程式碼,最後進行列印輸出
'''
class MyAttribute(object):
def __init__(self):
self.default = 0.0
self.age = 20
self.member = 21

#使用__getattribute__方法來確定是不是對每個屬性的訪問都需要呼叫該方法,並且在該方法中使用if語句判斷呼叫的屬性是否為test,如果是則執行相應的程式碼塊
def __getattribute__(self, name):
if name == 'test':
print('當呼叫的屬性不是test時,經過__getattribute__方法%s'%name)
return self.test
else:
print('當呼叫的屬性不是test時,列印輸出的值%s'%name)
return object.__getattribute__(self,name)

#__getattr__方法來確定所建立的例項呼叫的屬性是否在類中,若是不在會呼叫
def __getattr__(self, name):
print('經過__getattr__方法,列印輸出的name值是:%s'%name)
print('打印出的原先設定的default值:%s'%self.default)
return self.default

if __name__ == '__main__':
myattribute = MyAttribute()
myattribute.member
myattribute.so

'''
描述符(新式類)
它為物件屬性提供強大的API,其原理就是將某種特殊型別的類的例項指派給另一個類的屬性包含的方法有__get__()、__set__()和__delete__()
__get__()用於得到一個屬性的值
__set__()為一個屬性賦值
__delete__()採用del語句或者明確刪除某個屬性時被呼叫

'''
class MyDescription(object):
def __get__(self, obj, typ=None):
print('__get__方法,oby是:%r,typ是:%r'%(obj,typ))
return self.data
def __set__(self, obj, val):
print('__set__方法,oby是:%r,val是:%r'%(obj,val))
self.data = val
def __delete__(self, obj):
print('__delete__方法,obj是%r'%obj)
del self.data
class MyDesClass(object):
this = MyDescription()
that = MyDescription()
other = 4

mydesclass = MyDesClass()
mydesclass.this = 'nishiwodeweiyi'
print(mydesclass.this)
print('我是打印出類MyDesClass中other的值:',mydesclass.other)
mydesclass.other = 6
print('我是打印出重新賦值給other的值:',mydesclass.other)