2014-10-30 65 views
1

兩個示例;Python中的類屬性/變量

class Foo1: 
    something = 0 
    def __init__(self, n): 
     self.something = n 

class Foo2: 
    def __init__(self, n): 
     self.something = n 

兩個類似乎有相同的行爲:

x = Foo1(42) 
y = Foo2(36) 
print x.something 
# will print 42 
print y.something 
# will print 36 

但在類Foo1是變量self.something(構造函數)實際變量something爲在課程開始時定義?這裏有什麼不同?哪種方式更適合使用?

+0

的可能重複的[Python中:類和實例之間的區別屬性(http://stackoverflow.com/questions/207000/python-類與實例屬性之間的差異) – sebastian 2014-10-30 13:34:13

+1

此外,請檢查答案在http://stackoverflow.com/questions/2923579/python-class-attribute和http://stackoverflow.com/questions/68645/static -class變量功能於蟒蛇。 Foo1的每個實例都可以通過'x .__ class __來訪問(和分享)'something'。 – fredtantini 2014-10-30 13:34:51

+0

又一個:http://stackoverflow.com/q/206734/2319400 – sebastian 2014-10-30 13:36:08

回答

3

區別在於,在第一種情況下,您可以在不使用對象(或實例)的情況下訪問數據屬性。在第二種情況下,你不能。請檢查以下代碼片段:

>>> class Foo1: 
...  something = 0 
...  def __init__(self, n): 
...   self.something = n 
... 
>>> Foo1.something 
0 
>>> class Foo2: 
...  def __init__(self, n): 
...   self.something = n 
... 
>>> Foo2.something 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: class Foo2 has no attribute 'something' 
>>> 

希望我能說清楚。詳情請參閱:https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

+0

這是蟒蛇相當於C中的靜態變量嗎? – ap0 2014-10-30 13:33:34

+0

我不認爲Python需要C靜態變量概念。 – 2014-10-30 13:35:20

2

somethingself.something不一樣。當您訪問x.somethingy.something時,您正在訪問綁定到該實例的版本。原始something是局部的type而不是從該類型的對象:

>>> Foo1.something 
0 
>>> Foo1(42).something 
42