2

我在 Python 中遇到了一个我无法解决的有趣情况。我在一个类中有一个函数定义 def a(self, x, y):,它是从其他地方调用的,比如a(par1, par2). 但是,发生的情况是par1被替换而不是selfpar2而不是x并且y未初始化。但这不应该是这样:par1并且par2应该分别放置而不是xandy并且 Python 应该已经得到了self自己。这在 Python 2.7 中可以正常工作,但是这个有趣的事情发生在 3.2 中。方法 a 没有任何修饰符,但是我从中调用它的方法有@classmethod修饰符。有点奇怪,也许@classmethod 在第三个版本中被改变了。如果有人知道发生了什么或如何使事情正常工作,请告诉。

谢谢 !

4

1 回答 1

0

根据您的描述,我猜测类似于以下代码:

class Test(object):

    def a(self, par1, par2='empty'):
        print(self, par1, par2)

    @classmethod
    def b(cls, fjord):
        print(fjord)
        cls.a('par1', 'par2')

test = Test()
test.a('this', 'that')
test.b('cold')

在 2.7 中,这会像这样崩溃:

(<__main__.Test object at 0x00B4A710>, 'this', 'that')

cold

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    test.b('cold')
  File "test.py", line 7, in b
    cls.a('par1', 'par2')
TypeError: unbound method a() must be called with Test instance as first argument
           (got str instance instead)

虽然在 3.2 中它工作得很好——因为未绑定的方法不再存在,它们只是函数。

原因self不是实例,恰恰是因为它是从类方法调用的:类方法没有得到self,所以它不能传递它。

于 2012-02-06T21:19:09.353 回答