比方說,我們已經有了一個元類CallableWrappingMeta
該走了一類新的身體,包裹它的方法與一類,InstanceMethodWrapper
:作爲實例方法調用?
import types
class CallableWrappingMeta(type):
def __new__(mcls, name, bases, cls_dict):
for k, v in cls_dict.iteritems():
if isinstance(v, types.FunctionType):
cls_dict[k] = InstanceMethodWrapper(v)
return type.__new__(mcls, name, bases, cls_dict)
class InstanceMethodWrapper(object):
def __init__(self, method):
self.method = method
def __call__(self, *args, **kw):
print "InstanceMethodWrapper.__call__(%s, *%r, **%r)" % (self, args, kw)
return self.method(*args, **kw)
class Bar(object):
__metaclass__ = CallableWrappingMeta
def __init__(self):
print 'bar!'
我們的虛擬包裝只是打印參數,因爲他們進來,但你會注意到一些明顯的問題:該方法沒有通過實例對象接收器,因爲儘管InstanceMethodWrapper
是可調用的,但它不會被視爲用於在創建類時轉換爲實例方法的函數(在我們的元類爲用它完成)。
一個潛在的解決方案是使用裝飾器而不是類來包裝方法 - 該函數將成爲一個實例方法。但在現實世界中,InstanceMethodWrapper
要複雜得多:它提供了一個API併發布了方法調用事件。一個類更方便(並且性能更高,並不是這很重要)。
我也嘗試了一些死衚衕。子類types.MethodType
和types.UnboundMethodType
沒有去任何地方。有點內省,看起來他們從type
減少。所以我嘗試使用這兩個作爲元類,但也沒有運氣。這可能是他們作爲一個元類有特殊需求的情況,但是現在看來我們現在處於無證的領域。
任何想法?
你能解釋一下嗎?我無法理解你想要做什麼。 – Unknown 2009-05-03 01:24:46