舉例如下:
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 的變量是局部變量,作用域是當前函數(shù);加了 self 的變量是實例變量,作用域是當前實例。
也就是,我們在外部將類 Person 實例化時,可以調(diào)用它的 inputname 變量,因為這個變量是實例變量,作用域當前實例,卻調(diào)用不了 input1 變量,因為這個變量是局部變量,只能在setName 函數(shù)中使用。
self 是什么對象?
我們這里假設(shè) lil = Person(),其中 lil 是 Person 類的一個實例。
當我們調(diào)用 lil 的 setName 和 getName 或 greet 方法時,lil 自動將自己作為第一個參數(shù),傳入函數(shù)中,因此形象的稱為 self
所以 self 是一個實例,指的實例本身。
通過使用 self,我們可以在其成員方法中訪問他們要對其特性進行操作的對象本身了。
換句話說
這樣說很拗口,換句話說,我們通過使用 self,將 attribute 的作用域從當前函數(shù) 變成 當前實例,這樣這個 attribute 就可以在整個實例中都有效。這樣便于我們在不同的成員方法中對這個 attribute 進行操作。例如上面例子中的 self.name ,因為使用了 self,我們在 getName 和 greet 中均可以使用該實例變量。
而且,對于實例 lil,我們也可以直接調(diào)用 name 這個attribute,也就是 lil.name,是有效的。但是 lil.input1 是無效的,會提示“類里面沒有這個屬性”。