Python不定义__init__怎么知道实例变量呢?

How does Python know the instance variable without defining __init__?

让我们考虑以下示例:

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() takes 0 positional arguments but 1 was given

当我们实例化 class 时,会调用 __ new __ 并创建实例,好的。但是它如何在不定义 __ init __ 的情况下需要一个实例呢? (我很惊讶,因为我 总是 编写 __ init __ 认为它负责定义引用变量的约定/自身名称)。我很困惑。

当您调用 instance.run() if 隐式调用 run(instance) 时,这就是您收到错误的原因:

TypeError: run() takes 0 positional arguments but 1 was given

这也是实例方法应该将 self 作为第一个参数的原因。

其次,您使用的是声明 class - class X:
的旧方法 新的方式1class X(object):但是不管你是否使用new/old注解,调用X()都会return一个实例class,即使您没有定义 __init__.

第三,如果你想让它成为一个 class 方法,你可以按照 Pynchia 在上面的评论中建议的那样做(用 @staticmethod 注释方法)或者将方法声明为 class 方法通过指定第一个参数是 cls 并将其注释为 class-method:

class X:

    @classmethod
    def run(cls):
        print "a"


X.run()  # prints a

1. 根据下面 Mark 的评论,在 Python 3 中我们 return 到 "old way" 声明了一个 class。很高兴知道 - 谢谢马克!