python动态方法_python中的动态方法生成
這是一個元類,它將__getattr__函數從類定義添加回元類本身。這就避免了在多個地方定義函數,或者作為預先定義并單獨添加到元類和類中的單獨全局函數來定義。在class Meta(type):
def __new__(mcls, name, bases, dikt):
fgetattr = dikt.get('__getattr__')
if fgetattr is not None:
setattr(mcls, '__getattr__', fgetattr)
return super(Meta, mcls).__new__(mcls, name, bases, dikt)
class Generator(object):
__metaclass__ = Meta
def __getattr__(obj, name):
def f(self):
return "Result of %s for %r" % (name, self)
f.__name__ = name
if isinstance(obj, type):
setattr(obj, name, f)
else:
setattr(type(obj), name, f)
return getattr(obj, name)
與其通過動態函數的__get__描述符方法直接創建方法,不如將函數存儲在dict類中,并依賴getattr返回正確的綁定/未綁定方法。隨后的屬性訪問將使用類中的函數。由于類和實例都使用相同的__getattr__函數,因此需要進行isinstance檢查,以確保將動態函數存儲到類而不是實例中。在
在Python3中,將函數作為類的屬性只返回函數,因為未綁定的方法已從語言中移除。另外,metaclass syntax已更改為類定義行中的關鍵字參數。在
測試:
^{pr2}$
總結
以上是生活随笔為你收集整理的python动态方法_python中的动态方法生成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机组成原理 参考,计算机组成原理参
- 下一篇: ug10许可证错误一8_面对排污许可证后