有什么区别的一类和Python中DEF __init __(个体经营)编写代码? [重复](Wh

2019-08-04 17:28发布

可能重复:
内部和一类__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的,以及为什么。

Answer 1:

有几个关键的不同位置,在两者之间__init__ ,只是类下写它,还有你写什么。

与工作x = 1

首先,你是正确的-这些代码两项你的目的(特别是因为我们正在处理有效地做同样的事情int对象在这里,这将是可变对象不同):

需要注意的是,他们并没有真正做同样的事情-请上这个答案澄清的意见。

class main(object):
    x = 1


class main(object):
    def __init__(self):
        self.x = 1

这就是为什么很多不规范的Python库,像mongoenginedjango模型,有一个标准在那里,你不使用创建类__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争论否则。



Answer 2:

是的,在各种其它的问题所述,类体中定义的变量是类的属性,而在限定的那些def __init__(self)块是一个类的实例的属性。

在初始化定义成员在Python定义它在类体内之间差别?



Answer 3:

正如已经指出的,类属性(在类级分配)和实例属性(指定为例如在自属性__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


Answer 4:

让我们看看下面的类定义:

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变量。



Answer 5:

这不一样。 在第一个例子,你有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]