舉例如下:
class Person:
def setName(self,name):
self.name = name
self.inputname = name
input1 = name
def getName(self):
return self.name
def greet(self):
print "Hello world! I'm %s ." % self.name
其中译仗,self是對于對象自身的引用。
我們對比 self.inputname
和 input1
這兩個變量官觅,都賦值為 name
纵菌,那么這兩個值有什么區(qū)別呢?
在這里缰猴,self 改變了變量的作用域产艾。
不加 self 的變量是局部變量疤剑,作用域是當前函數滑绒;加了 self 的變量是實例變量,作用域是當前實例隘膘。
也就是疑故,我們在外部將類 Person 實例化時,可以調用它的 inputname 變量弯菊,因為這個變量是實例變量纵势,作用域當前實例,卻調用不了 input1 變量管钳,因為這個變量是局部變量钦铁,只能在setName 函數中使用。
self 是什么對象才漆?
我們這里假設 lil = Person()牛曹,其中 lil 是 Person 類的一個實例。
當我們調用 lil 的 setName 和 getName 或 greet 方法時醇滥,lil 自動將自己作為第一個參數黎比,傳入函數中超营,因此形象的稱為 self
所以 self 是一個實例,指的實例本身阅虫。
通過使用 self演闭,我們可以在其成員方法中訪問他們要對其特性進行操作的對象本身了。
換句話說
這樣說很拗口颓帝,換句話說米碰,我們通過使用 self,將 attribute 的作用域從當前函數 變成 當前實例购城,這樣這個 attribute 就可以在整個實例中都有效见间。這樣便于我們在不同的成員方法中對這個 attribute 進行操作。例如上面例子中的 self.name 工猜,因為使用了 self米诉,我們在 getName 和 greet 中均可以使用該實例變量。
而且篷帅,對于實例 lil史侣,我們也可以直接調用 name 這個attribute,也就是 lil.name
魏身,是有效的惊橱。但是 lil.input1
是無效的,會提示“類里面沒有這個屬性”箭昵。