使用元類,我試圖通過簡化現有的實例方法來創建實例方法。問題是部分不適用於實例方法。這是我做的嘗試,以實現一個簡單的例子:使用Python中的partial創建元類中的實例方法3
from functools import partial
class Aclass(object):
def __init__(self, value):
self._value = value
def complex(self, a, b):
return a + b + self._value
class Atype(type):
def __new__(cls, name, bases, attrs):
return super(Atype, cls).__new__(cls, name, (Aclass,) + bases, attrs)
def __init__(cls, name, bases, attrs):
setattr(cls, 'simple', partial(cls.complex, b=1))
class B(metaclass=Atype):
pass
b = B(10)
print(b.complex(1, 2))
print(b.simple(1))
,輸出是:
13
Traceback (most recent call last):
File "metatest.py", line 22, in <module>
print(b.simple(1))
TypeError: complex() takes exactly 3 non-keyword positional arguments (1 given)
我已經使用lambda解決了改變:
setattr(cls, 'simple', partial(cls.complex, b=1))
到:
setattr(cls, 'simple', lambda self, x: cls.complex(self, x, b=1))
但它是醜陋的d有可選參數的問題。
我可以在實例__init__
上創建這些方法,但我認爲這樣做更有意義,並且使用元類在類__init__
上更有效。
任何想法如何正確地做到這一點?
@martineau:我完全使用python-3.x標籤,但我沒有看到任何不使用「python」的理由。另外 - 不會「python3」成爲一個清潔標籤? – jsbueno 2011-03-02 01:15:08
@jsbueno:同意 - 但它不會讓我將python-3.x更改爲python3。 – martineau 2011-03-02 01:54:55
@jsbueno:標籤是python-3.x,我不知道(如果有的話)這些東西是決定的。我懷疑它可以在meta上進行討論,然後在有支持的情況下進行更改。無論如何python3是一個同義詞,所以你可以輸入它,它會被重新映射。 – 2011-03-02 08:10:04