我們觀察到在類中定義方法時,都帶有self形參,為何必須在方法中定義形參self呢?
因為Python調用方法創建類實例時,將自動傳入實參self。每個與類相關聯的方法調用都自動傳遞實參self,他是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法。
以self為前綴的變量都可供類中的所有方法使用,我們還可以通過類的任何實例來訪問這些變量。
class Dog(): '''一次模擬小狗的簡單嘗試''' def __init__(self, name, age): '''初始化屬性name和age''' self.name = name self.age = age def sit(self): '''模擬小狗被命令時蹲下''' print(self.name.title() + "is now sitting.") def roll_over(self): '''模擬小狗被命令時打滾''' print(self.name.title() + " rolled over!")
這里注意的地方很多,我們慢慢來說:
根據約定,在Python中,首字母大寫的名稱指的是類。這個類定義中的括號是空的,因為我們要從空白創建這個類。
(1)方法__init__()
類中的函數稱為方法;__init__()是一個特殊的方法,每當你根據Dog類創建新實例時,Python會自動運行它。在這個方法的名稱中,開頭和末尾各有兩個下划線,這是一種約定,旨在避免Python默認方法和普通方法發生名稱沖突。
方法__init__()定義成包含三個形參:self、name和age。在這個方法的定義中,形參self必不可少,還必須位於其他形參的前面。為何必須在方法定義中包含形參self呢?因為Python調用這個__init__()方法來創建Dog實例時,將自動傳入實參self。每個與類相關聯的方法調用都自動傳遞實參self,它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法。我們創建Dog實例時,Python將自動調用Dog類的方法__init__().我們將通過實參向Dog()傳遞名字和年齡;self會自動傳遞,因此我們不需要傳遞它。每當我們根據Dog類創建實例時,都只需給最后兩個形參(name和age)提供值。
sit和roll_over中定義的兩個變量都有前綴self。以self為前綴的變量都可供類中的所有方法使用,我們還可以通過類的任何實例來訪問這些變量。self.name=name獲取存儲在形參name中的值,並將其存儲到變量name中,然后該變量被關聯到當前創建的實例。self.age=age的作用與此類似。像這樣可以通過實例訪問的變量稱為屬性。