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:
的旧方法
新的方式1是class 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。很高兴知道 - 谢谢马克!
让我们考虑以下示例:
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:
的旧方法
新的方式1是class 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。很高兴知道 - 谢谢马克!