1

我有一个具有如下功能的类:

def foo(self):
    do_stuff()

我这样称呼它:

instance.foo()

我得到这个错误:

TypeError: foo() takes exactly 1 argument (0 given)

但这很好用:

instance.foo(instance)

谁能解释为什么会发生这种情况?这让我有点奇怪

如果您需要更多信息,请随时询问

编辑这里是实际代码的近似值......

def __new__(self):
    blah blah
    MyClass.__init__(self,blah)
    self.foo(self)     #<------------------------error here

我怀疑我误解了它__new__的工作原理......我现在正在阅读

4

2 回答 2

3

这里的问题是函数不接受 self 作为参数,因为您正在其中创建一个新对象。第一个参数实际上是类,通常缩写为 cls。

来源

修正样本:

def __new__(cls):
    blah blah
    obj = MyClass.__new__(MyClass)
    obj.foo()
    return obj

这将创建一个 MyClass 的实例而不是 cls。如果 MyClass 是 cls 的子类,那么它的 init 方法也会被自动调用(参见链接参考)

于 2013-01-28T11:52:09.603 回答
0
class MyClass  
    def __new__(cls):
        blah
        o = object.__new__(cls)
        o.foo()
        return o

__new__需要返回一个实例。它将 MyClass 作为参数,而不是 MyClass 的实例。

为了在 中实例化MyClass__new__使用object.__new__了。这是为了防止无限递归

__init____new__只要该值是 MyClass 类型,就会在返回值上自动调用。这可以通过使用元类来防止

于 2013-01-28T13:44:18.107 回答