2015-10-15 70 views
1

在Python中關於這兩個語句的語義差異是什麼?關於在Python中正確使用__init__

class Person : 
     age = 5 

class Person : 

     def __init__(self): 
      self.age = 5 

如果我不實例化,在這兩種情況下,一個對象,如

mario = Person() 

在這兩種情況下marioage是5

所以,如果分配了一個對象,那麼需要使用__init__方法即使沒有使用__init__

回答

3

__init__屬性是指一個類的實例的變量,在類的下面意味着它是一個類變量。

它將主要不管你什麼時候使用例如列表的變量:右課下會使類之間共享實例,也就是說,如果你在類的一個實例添加到列表清單,所有其他實例的課程還將「查看」列表中的附加項目。當您使用__init__

class Foo: 
    x = [] 

a = Foo() 
b = Foo() 
a.x.append(1) 

b.x == [1] # True 

c = Foo() # Even being created after 1 has been appended, still: 
c.x == [1] # True 

這不是的情況下,「x」屬性將是每個實例是唯一的。

1

兩者之間的區別在於,在上面的示例中,您正在創建類屬性,而在init中您正在創建一個實例屬性。兩者之間的區別是:

class Foo(): 
    bob = "my name is bob" 

print(Foo.bob) 
# outputs "my name is bob" 

class Foo(): 
    def __init__(self): 
     self.bob = "my name is bob" 

print(Foo.bob)

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: type object 'Foo' has no attribute 'bob' 

要在初始化訪問鮑勃你必須實例:

f = Foo() 
print(f.bob) 
# outputs "my name is bob" 

什麼進一步區分t這些實現中的一個是,類屬性將在所有實例之間共享,而實例屬性僅在您的實例中共享。

因此,對於您的__init__中定義的任何內容,如果您創建Foo的新對象,則不會對init中的變量進行任何對Foo的其他實例的更改。

但是,對於類屬性,無論您更改的任何類屬性都將在所有Foo實例中更改。