【发布时间】:2011-03-01 22:18:18
【问题描述】:
使用元类,我试图通过简化现有实例方法来创建实例方法。问题是 partial 不适用于实例方法。这是我尝试实现的一个简单示例:
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))
但它很丑,可选参数有问题。
我可以在实例 __init__ 上创建这些方法,但我想这更有意义,并且在 __init__ 类上使用元类更有效。
任何想法如何正确地做到这一点?
【问题讨论】:
-
@martineau:我完全赞成使用 python-3.x 标签,但我认为没有任何理由不使用“python”。另外 - “python3”不是更干净的标签吗?
-
@jsbueno:同意——但它不允许我将 python-3.x 更改为 python3。
-
@jsbueno:标签是python-3.x,我不知道(如果有的话)这些事情是如何决定的。我怀疑它可以在元上讨论,然后如果有支持就改变。无论如何python3是一个同义词,所以你可以输入它,它会被重新映射。
标签: python methods python-3.x partial