# -*- coding:utf-8 -*- #
class funwrap(object):
u"""包裝乙個函式"""
def __init__(self, func):
self.func = func
def __get__(self, obj, typ = none):
return szhinstancemethod(typ, obj, self)
def __call__(self, *args):
return self.func(*args)
def __getattr__(self, name):
return getattr(self.func, name)
class szhinstancemethod(object):
u"""模擬instancemethod"""
def __init__(self, im_class, im_self, im_func):
self.im_class = im_class
self.im_self = im_self
self.im_func = im_func
def __call__(self, *args):
if not self.im_self:
raise typeerror, "unbound method " + self.im_funcw.func_name + \
"() must be called with " + \
(self.im_class.__name__ if self.im_class else '?') + " instance"
return self.im_func(self.im_self, *args)
def __repr__(self):
if not self.im_self:
return '__szh"
else:
return '__szh"
class szhclassmethod(object):
u"""模擬classmethod"""
def __init__(self, func):
self.func = func
def __get__(self, obj, typ = none):
typ = typ or type(obj)
return szhinstancemethod(type(typ), typ, self.func)
class szhstaticmethod(object):
u"""模擬staticmethod"""
def __init__(self, func):
self.func = func
def __get__(self, obj, typ = none):
return self.func
if __name__ == '__main__':
class a(object):
@funwrap
def f(self):
print 'test method ' + str(self)
@szhclassmethod
@funwrap
def clsf(cls):
print 'test class method ' + str(cls)
@szhstaticmethod
@funwrap
def staf():
print 'test static method'
a = a()
a1 = a()
print u"例項a訪問方法f",a.f
print u"例項a1訪問方法f",a1.f
print u"類a訪問方法f",a.f
a.f()
a1.f()
print u"例項a訪問類方法clasf",a.clsf
print u"類a訪問類方法clasf",a.clsf
a.clsf()
a.clsf()
print u"例項a訪問靜態方法staf",a.staf
print u"類a訪問靜態方法staf",a.staf
a.staf()
1描述符 作為某一物件aa的屬性被訪問時, python會呼叫描述符的__get__方法 該物件aa會作為引數被隱示傳入
2 但是以字典key訪問時不會觸發這個__get__方法
1 object_instance.descriptor_a 觸發descriptor.__get__(self, object_instance) 返回乙個bound方法(他有im_fun, im_self, im_class屬性 可以用於區分乙個方法是否為bound)
2 object_instance.__dict__['descriptor_a'] 則是直接返回乙個描述符物件
所以monkey_patch 描述符如類方法 例項方法時
for field_name, value in object_a.__dict__.items():
if value.is_callable():
setattr(item, fieldname, value) 而不是 getattr(object_a, name) 因為他返回的是乙個bound的方法 而 value則是乙個描述符物件
python 描述 python描述符
在python中,訪問乙個屬性的優先順序順序按照如下順序 1.類屬性2.資料描述符3.例項屬性4.非資料描述符5.getattr 方法。描述符,用一句話來說,就是將某種特殊型別的類的例項指派給另乙個類的屬性 注意 這裡是類屬性,而不是物件屬性 而這種特殊型別的類就是實現了 get set delet...
python 描述符基本
相關資料 python的描述符 下一站,我等你 描述符的本質類 python為開發者提供了乙個非常強大的功能 描述符。那什麼是描述符呢?通過檢視python的官方文件,我們知道把實現了 get set 和 delete 中的其中任意一種方法的類稱之為描述符,描述符的本質是新式類,並且被 的類 即應用...
Python 描述符練習
要求 先定義乙個溫度類,然後定義兩個描述符用於描述攝氏度和華氏度兩個屬性 要求這個兩個屬性會自動進行轉換,也就是說你可以給攝氏度這個屬性賦值,然後列印的話華氏屬性是自動轉換的結果 class celsius def init self,value 26.0 self.value float valu...