这里有几个关键的区别,无论__init__
是在课堂上还是在课堂上写,以及你写的东西。
与x = 1
首先,你是对的——这两条代码有效地为你的目的做同样的事情(特别是因为我们在int
这里使用对象,这对于可变对象会有所不同):
请注意,他们实际上并没有做同样的事情——请参阅对此答案的评论以进行澄清。
class main(object):
x = 1
class main(object):
def __init__(self):
self.x = 1
这就是为什么许多非标准 Python 库(如模型mongoengine
和django
模型)都有一个标准,您可以在不使用__init__
语句的情况下创建类,以免覆盖内置的类,但仍允许您创建类属性,例如 Django 示例:
class mymodel(models.model):
name = models.CharField(max_length=20)
url = models.UrlField()
然而,正如另一张海报指出的那样,两者之间的区别在于,当x=1
它在函数之外时__init__
,即使没有初始化,它也是类本身的一部分——有关更多详细信息,请参见Zagorulkin Dmitry的回答。但是,在大多数情况下,这种区别与您无关。
其他注意事项
__init__
除了设置变量之外,还有更多用途。最重要的一项是在初始化期间接受参数的能力。 据我所知,没有__init__
函数就没有办法做到这一点。我会在这个例子中告诉你我的意思。
假设我们正在创建一个Person
类,当我们创建一个 时Person
,我们提供他们的年龄,然后他们的出生年份会自动为我们计算出来。
import datetime
class Person(object):
def __init__(self, age):
self.age = age
self.birth_year = (datetime.date.today() - datetime.timedelta(days=age*365)).year
正在使用:
>>>joe = Person(23)
>>>joe.age
23
>>>joe.birth_year
1990
如果没有 ,这是不可能的__init__
,因为否则我们无法将初始化传递给age
参数。