【发布时间】:2011-04-12 08:47:51
【问题描述】:
在我的代码中,我有一个返回类实例的方法,如下所示:
class MyClass:
def fun( self, *args ): # the method
return Props( self, *args )
class Props: # the returned object
def __init__( self, parent, *args ):
self.parent = parent
self.args = args
为了让事情井井有条,我正在考虑将 Props 放在 MyClass 中。然后我想绕过fun,直接让类成为MyClass的实例方法,像这样:
class MyClass:
@instancemethod # does not exist!
class fun:
def __init__( self, parent, *args ):
self.parent = parent
self.args = args
注意注释 - instancemethod 装饰器不存在。
有没有办法做到这一点,即将可调用对象转换为实例方法?如果我将@instancemethod 更改为@classmethod,则构造工作,当然,父类是类,而不是实例。我很惊讶我找不到任何关于似乎相反的操作的信息。
很想解决这个问题!
编辑:
看来我的问题并不清楚。我所拥有的是一个成员函数 fun,它返回的不是单个值或元组,而是一个充满数据的对象。此数据是根据 MyClass 对象和函数参数的内容生成的。我的初始代码完全符合我的要求。第二个代码是我喜欢的写法。
此外,我注意到我正在寻找的装饰器只是以下内容:
def instancemethod( cls ):
def f( *args ):
return cls( *args )
return f
当然,这与我打算绕过的“有趣”方法相同。另请注意,微不足道的“返回 cls”并不相同,尽管乍一看可能是这样。
有了这个装饰器,我的第二个类定义是有效的,并产生了预期的结果,即 a.fun() 返回一个对象,该对象(可能)基于 a: 中的数据初始化:
a = MyClass()
p = a.fun(1,2,3)
print a # <__main__.MyClass instance at 0xb775b84c>
print p.parent # <__main__.MyClass instance at 0xb775b84c>
print p.args # (1, 2, 3)
如果此处定义的 instancemethod 不能作为 python 内置函数使用,这仍然给我留下了一个问题,因为它似乎是 classmethod 和 staticmethod 旁边的遗漏。但是,如果不是,我想我可以接受这种结构。
【问题讨论】:
-
可调用对象必须实现
__call__方法 -
第一个代码 sn-p 看起来更有条理。 jast move
Proopsfun函数体中的类定义
标签: python decorator instance-method