3

在我的代码中,我有一个返回类实例的方法,如下所示:

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 旁边的遗漏。但是,如果不是,我想我可以接受这种结构。

4

3 回答 3

1

我不确定您到底要做什么,但我怀疑您想阅读descriptors

基本上,描述符是一个类的属性,它本身就是一个定义 __get____set__方法的类。在您的情况下,您可以将代码从 移动Props.__init__Props.__set__,设置Propsfun类的属性,并且一切都应该按照您的意愿工作。

于 2011-04-12T09:23:10.997 回答
1

我认为您无缘无故地使事情复杂化了;也许您已经习惯了其他语言,并希望从那里继承您的习惯。

IIUC,您打算执行以下操作:

class SomeClass:
    # typical stuff
    def __init__(self, other, arg1, arg2, arg3, arg4):
        self.parent= other
        # blah blah

class SomeOtherClass:
    # initialize in __init__, setup stuff
    def __init__(self, initarg1, initarg2):
        self.initarg1= initarg1
        self.initarg2= initarg2

    def fun(self, arg3, arg4):
        # return an instance of SomeClass based on
        # initargs and arguments
        return SomeClass(self, self.initarg1, self.initarg2, arg3, arg4)
于 2011-05-05T15:03:49.517 回答
0

您不需要 instancemethod 装饰器,这应该可以工作:

class MyClass:
  class fun:
    def __init__( self, parent, *args ):
      self.parent = parent
      self.args = args

m = MyClass()
f = m.fun(None, 1, 2, 3)
print f.args

您还可以将第一个示例更改为

class Props:
    def __init__( self, parent, *args ):
        self.parent = parent
        self.args = args


class MyClass:
    fun = Props

m = MyClass()
f = m.fun(None, 1, 2, 3)
print f.args
于 2011-04-12T09:09:21.613 回答