可能重复:
内部和一类__init __的外侧()函数变量
我明白,当一个类被调用时,它将在运行代码__init__
任何事情之前。 我还没有看到这之间的区别,类下直接写代码。
例如:
class main():
x = 1
def disp(self):
print self.x
class main():
def __init__(self):
self.x = 1
def disp(self):
print self.x
对我来说,都具有相同的功能。 (也许我错过了一些东西。)我想知道哪个更(啊哈)Python的,以及为什么。
有几个关键的不同位置,在两者之间__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__
功能,它是类本身的一部分,即使不intialized -见Zagorulkin梅德的更多答案细节上。 在大多数情况下,虽然,这种区别不会与您无关。
其他注意事项
还有更多的用途__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
争论否则。
是的,在各种其它的问题所述,类体中定义的变量是类的属性,而在限定的那些def __init__(self)
块是一个类的实例的属性。
在初始化定义成员在Python定义它在类体内之间差别?
正如已经指出的,类属性(在类级分配)和实例属性(指定为例如在自属性__init__
)是不同的。
在另一方面,在第一类要定义两种不同的属性(类x
和实例x
是共存),但可以互相干扰。 下面的代码试图表明,如果你定义的类,这样你可以得到的问题。
In [32]: class main():
....: x = 1
....: def disp(self):
....: print(self.x)
....:
# I create 2 instances
In [33]: jim = main()
In [34]: jane = main()
# as expected...:
In [35]: main.x
Out[35]: 1
In [36]: jim.x
Out[36]: 1
In [37]: jane.x
Out[37]: 1
# now, I assign to jim attribute x
In [38]: jim.x = 5
# main class preserves its attribute value as well as jane instance
In [39]: main.x
Out[39]: 1
In [40]: jane.x
Out[40]: 1
# But what happens if I change the class attribute ?
In [41]: main.x = 10
# nothing to jim (I overwrote before jim.x)
In [42]: jim.x
Out[42]: 5
# but jane did see the change
In [43]: jane.x
Out[43]: 10
让我们看看下面的类定义:
class Main:
x = 1
def __init__(self):
self.y = 5
在这种情况下,我们可以直接引用X,如: Main.x
即它是一个类属性,这属于这一类的每个对象。
>>>Main.x
1
但是,属性y
是特定于每个对象。 我们不能直接引用它是这样的:
>>> Main.y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class Main has no attribute 'y'
您需要实例化类主要的目的是指Y:
>>> obj = Main()
>>> obj.y
5
这类似于static
C ++和Java变量。
这不一样。 在第一个例子,你有x
无需初始化。
>>> class main():
... def __init__(self):
... self.x =1
...
>>> test2 = main()
>>> dir(test2)
['__doc__', '__init__', '__module__', 'x']
>>> class main1():
... x =1
... def disp(self):
... print self.x
...
>>> dir(main1)
['__doc__', '__module__', 'disp', 'x']
>>> dir(main)
['__doc__', '__init__', '__module__']
>>>
文章来源: What is the difference writing code in a class and in def __init__(self) in Python? [duplicate]