我有一个类似这样的函数的类:
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__
如何运作......我现在正在阅读
答案 0 :(得分:3)
这里的问题是 new 函数不接受self作为参数,因为你在其中创建一个新对象。第一个参数实际上是类,通常缩写为cls。
更正样本:
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__
。这是为了防止无限递归
__init__
值上自动调用 __new__
。这可以通过使用元类