What is the difference writing code in a class and in def __init__(self) in Python?
Possible Duplicate:
Variables inside and outside of a class __init__() function
我理解,当调用一个类时,它会先运行
例如:
1 2 3 4 5 | class main(): x = 1 def disp(self): print self.x |
1 2 3 4 5 6 | class main(): def __init__(self): self.x = 1 def disp(self): print self.x |
对我来说,两者都具有相同的功能。(也许我漏掉了什么)我想知道哪一个更像(啊哈)Python,为什么。
如前所述,类属性(在类级别分配)和实例属性(例如在
另一方面,在第一个类中,您定义了两个不同的属性(类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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 |
这里有两个关键的区别,一个是
首先,您是对的——这两项代码实际上为您的目的做了相同的事情(特别是因为我们在这里处理
请注意,他们实际上并没有做同样的事情——请参阅对这个答案的评论以获得澄清。
1 2 | class main(object): x = 1 |
1 2 3 | class main(object): def __init__(self): self.x = 1 |
这就是为什么许多非标准的python库(如
1 2 3 | class mymodel(models.model): name = models.CharField(max_length=20) url = models.UrlField() |
然而,正如另一张海报所指出的那样,两者之间有一个区别,即当
除了设置变量外,
假设我们正在创建一个
1 2 3 4 5 | import datetime class Person(object): def __init__(self, age): self.age = age self.birth_year = (datetime.date.today() - datetime.timedelta(days=age*365)).year |
使用中:
1 2 3 4 5 | >>>joe = Person(23) >>>joe.age 23 >>>joe.birth_year 1990 |
如果没有
是的,如其他各种问题所述,在类体中定义的变量是类的属性,而在
在in it中定义成员与在python中的类体中定义成员之间的区别?
让我们考虑以下类定义:
1 2 3 4 5 | class Main: x = 1 def __init__(self): self.y = 5 |
在这种情况下,我们可以直接引用x,如:
1 2 | >>>Main.x 1 |
但是,属性
1 2 3 4 | >>> Main.y Traceback (most recent call last): File"<stdin>", line 1, in <module> AttributeError: class Main has no attribute 'y' |
您需要实例化一个类main的对象来引用y:
1 2 3 | >>> obj = Main() >>> obj.y 5 |
这类似于C++和Java中的EDCOX1和18变量。
这是不同的。在第一个示例中,您有没有初始化的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | >>> 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__'] >>> |