關於python中的self,ins , cls的解釋

關於python中的self,ins,cls的解釋參考下面兩篇博文html

首先是self: (參考http://www.cnblogs.com/linuxcat/archive/2012/01/05/2220997.html
python

  1. 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


  2. 爲何不是指向類自己呢,以下例子:函數

    class Person:
        def _init_(self,name):
            self.name=name
        def sayhello(self):
            print 'My name is:',self.name
    p=Person('Tom')
    p1 = Person('Jim')
    print p
    spa

    若是self指向類自己,那麼當有多個實例對象時,self指向哪個呢?.net

  3. 若是用了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。

相關文章
相關標籤/搜索