在我的代码中,我有一个返回类实例的方法,如下所示:
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
当然,这与我打算绕过的“有趣”方法相同。还要注意,微不足道的“return 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 旁边的遗漏。但是,如果不是,我想我可以接受这种结构。