的事實是,在蟒蛇有類和實例之間有明顯的區別屬性:在類體內聲明
屬性,任何方法外,有類屬性,它們是相同的該類的每個對象都是由子類繼承的對象。請注意,做instance_obj.class_att = something
不會更改類屬性的值,但只是創建實例屬性並隱藏該對象的共享類屬性。
實例屬性是聲明語法instance_obj.att = something
的那些,他們沒有實例之間共享和最相似的事情,你在其他編程語言有非靜態的屬性,它們通常在創建init方法。 self
只是一個約定,用於指示自動傳遞給方法的實例對象。
下面是一個例子:
class MyClass:
c = 1 #class attribute, the subclasses will inherit this
def __init__(self):
self.i = 1 #instance attribute
MyClass.c #access attribute c of class MyClass
MyClass.i #error! MyClass has no attribute i
x = MyClass() #calling __init__ creates instance attribute i for obj x
x.i #access instance attribute i of object x
x.c #access class attribute c of class MyClass
x.c = 2 #hide MyClass.c and create instance attribute c for obj x
x.c #access instance attribute c of obj x
所以,總結一下,這樣做的:
class y(x):
def __init__(self):
x.__init__(self)
是有用的,因爲如果基類本來這樣的事情
class x:
def __init__(self):
self.i=1
你不可能從任何y的實例訪問屬性i只是因爲他們不會擁有它。
的基類可能會改變。 –