關於python中的self,ins,cls的解釋參考下面兩篇博文html
首先是self: (參考http://www.cnblogs.com/linuxcat/archive/2012/01/05/2220997.html)
python
self比較好理解,self指的是類實例對象自己(注意:不是類自己)linux
class Person:
def _init_(self,name):
self.name=name
def sayhello(self):
print 'My name is:',self.name
p=Person('Tom')
print pide
爲何不是指向類自己呢,以下例子:
函數
class Person:
spa
def _init_(self,name):
self.name=name
def sayhello(self):
print 'My name is:',self.name
p=Person('Tom')
p1 = Person('Jim')
print p
若是self指向類自己,那麼當有多個實例對象時,self指向哪個呢?.net
若是用了staticmethod,那麼就能夠無視這個self,而將這個方法當成一個普通的函數使用code
class A(object):
def foo1(self):
print "Hello",self
@staticmethod
def foo2():
print "hello"
@classmethod
def foo3(cls):
print "hello",cl
orm
2、上面例子已經看到cls, 對於classmethod,它的第一個參數不是self,是cls,它表示這個類自己。htm
(參考http://blog.csdn.net/daijiguo/article/details/52664188)
class A(object):
def foo1(self):
print "Hello",self
@staticmethod
def foo2():
print "hello"
@classmethod
def foo3(cls): print "hello",cls # cls就是類A自己
a = A()
a.foo1()
>>hello <__main__.A object at 0x03169110>
A.foo1(a) #這裏傳入實例a,至關於普通方法的self
>>
hello <__main__.A object at 0x03169110>
A.foo2() #這裏,因爲靜態方法沒有參數,故能夠不傳東西
>>hello
A.foo3() #這裏,因爲是類方法,所以,它的第一個參數爲類自己。
>>hello <class '__main__.A'>
print A #能夠看到,直接輸入A,與上面那種調用返回一樣的信息。
>><class '__main__.A'>
3、再來看ins (參考http://python.jobbole.com/81921/)
class Desc:
def __get__(self, ins, cls):
print('self in Desc: %s ' % self )
print(self, ins, cls)
class Test:
x = Desc()
def prt(self):
print('self in Test: %s' % self)
t = Test()
t.prt()
t.x
運行結果以下:
self in Test: <__main__.Test object at 0x0000000002A570B8>
self in Desc: <__main__.Desc object at 0x000000000283E208>
<__main__.Desc object at 0x000000000283E208> <__main__.Test object at 0x0000000002A570B8> <class '__main__.Test'>
大部分童鞋開始有疑問了,爲何在Desc類中定義的self不是應該是調用它的實例t嗎?怎麼變成了Desc類的實例了呢?
注意:這裏調用的是t.x,也就是說是Test類的實例t的屬性x,因爲實例t中並無定義屬性x,因此找到了類屬性x,而該屬性是描述符屬性,爲Desc類的實例而已,因此此處並無頂用Test的任何方法。
那麼咱們若是直接經過類來調用屬性x也能夠獲得相同的結果。
下面是把t.x改成Test.x運行的結果。
self in Test: <__main__.Test object at 0x00000000022570B8>
self in Desc: <__main__.Desc object at 0x000000000223E208>
<__main__.Desc object at 0x000000000223E208> None <class '__main__.Test'>
題外話:因爲在不少時候描述符類中仍然須要知道調用該描述符的實例是誰,因此在描述符類中存在第二個參數ins,用來表示調用它的類實例,因此t.x時可 以看到第三行中的運行結果中第二項爲<main.Test object at 0x0000000002A570B8>。而採用Test.x進行調用時,因爲沒有實例,因此返回None。