让我们考虑以下例子:
class X:
def run(self):
print("An example.")
X().run()
输出结果为:
> An example.
但是当我们省略对实例的引用时:
class X:
def run():
print("An example.")
X().run()
The output is:
TypeError:run()获取0个位置参数,但是给出了1个
当我们实例化类时,__ new __被调用并且实例被创建,好的。但它如何在没有定义__ init __的情况下需要实例? (我很惊讶因为,我总是写__ init __认为它负责定义引用变量的约定/自我名称)。我很困惑。
答案 0 :(得分:2)
如果您隐式调用instance.run()
,则致电run(instance)
,这就是您收到错误的原因:
TypeError:run()获取0个位置参数,但是给出了1个
这也是实例方法应该以{{1}}作为第一个参数的原因。
其次,你正在使用旧的方式宣布一个班级 - self
新的方式 1 是class X:
,但无论你是否使用新/旧注释,调用class X(object):
都将返回该类的实例,即使你没有定义X()
。
第三,如果你想让它成为一个类方法,你可以做Pynchia在上面的注释中建议的内容(使用__init__
注释方法)或者通过指定第一个方法将方法声明为类方法参数是@staticmethod
并将其注释为类方法:
cls
<子> 1.根据马克在下面的评论,在Python 3中,我们回到了声明一个类的“旧方式”。很高兴知道 - 谢谢马克! 子>