self只有在類的方法中才會有,獨立的函數和方法裏面是沒有的,在定義類的時候 python 是強制聲明 self 的,不過在實例化以後調用時能夠不用傳入相應的參數,self 不是 python 的關鍵字,只是約定俗成的,把 self 換成別的也是能夠的。python
self 是指類實例對象自己,不是類自己,即類實例化以後的對象。數據結構
高級語言的類相似於 C 語言的結構體,C 語言的結構體定義了特定的數據結構,而高級語言的類則在結構體上更進了一步,將函數的功能也放了進去,也就是動態的數據結構,固然跟結構體同樣,聲明的時候自己是不會建立內存空間的,結構體只有在聲明給變量以後纔會在內存中建立實際地址,類也是同樣的,須要實例化纔對應實際的內存空間。函數
因爲類是抽象的模板,那麼就能夠在建立實例的時候,把必須綁定的屬性強制加入其中,Python 提供一個特殊的 __init__ 方法,在建立實例的時候,把須要的屬性添加進去。spa
class Student(object): def __init__(self, name, age): self.name = name self.age = age def print_age(self): print('%s :%s' % (self.name, self.age))
這樣在實例化的時候,就須要傳入 name 和 age 兩個屬性了code
b = student('Alan', 24)
有了 __init__ 方法,在建立實例的時候,就不能傳入空的參數了,必須傳入與 __init__ 方法匹配的參數,但 self 不須要傳,Python解釋器本身會把實例變量傳進去,在類中定義的函數只有一點不一樣,就是第一個參數永遠是實例變量 self,可是在調用的時候,不用傳入 self 參數。對象
面嚮對象語言中,有一個特定是數據封裝,例如上面的 student 類中,後續實例化的實例中都會擁有 name 和 age 兩個數據,就能夠經過外部函數來訪問這些數據了:內存
def print_age(std): print('%s :%s' % (std.name, std.age) bart = student('Alan', 24) print_age(bart)
既然 student 實例自己擁有這些數據,那麼想要訪問這些數據,就沒有必要在外部聲明函數來訪問,能夠直接在 student 內部定義訪問數據的函數,這樣就把數據「封裝」起來了,這些封裝數據的函數和 student 類自己是關聯起來的,稱之爲類的方法----不一樣於 C 語言結構體的地方,C 語言的結構體並無把數據封裝起來。it