Python有时不会将类实例作为第一个参数传递 - 理解__new__

时间:2013-01-28 10:52:08

标签: python python-3.x python-3.2

我有一个类似这样的函数的类:

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__如何运作......我现在正在阅读

2 个答案:

答案 0 :(得分:3)

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

Source

更正样本:

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

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

答案 1 :(得分:0)

class MyClass  
    def __new__(cls):
        blah
        o = object.__new__(cls)
        o.foo()
        return o

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

要在MyClass中实例化__new__,我会使用object.__new__。这是为了防止无限递归

只要此值为MyClass类型,就会在返回的__init__值上自动调用

__new__。这可以通过使用元类

来防止