python 描述符 類方法 閉包

2021-06-25 13:55:45 字數 2679 閱讀 2716

# -*- 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...