self是類的實例
self有點類似java中的this,無實際意義。但是約定俗成的都是用self表示類的實例
class A: def func(self): print(self) #指向的是類的實例
print(self.__class__) #指向的是類
a = A() a.func() #<__main__.A object at 0x02C40F10> #<class '__main__.A'>
#a=A() a.func()過程等價於
A.func(a)
self代表類的實例,而非類。
self可不可以省略?
先看代碼,執行情況
class B: def func(): print("ok!") b = B() b.func() #TypeError: func() takes 0 positional arguments but 1 was given
報錯了,原因很簡單。b=B() b.func()過程等價於 B.fun(b),func()在B類中是不需要參數的,所以多傳了一個參數b,就會報錯
那么要想執行成功,就需要執行:
>>>B.func()
繼承中的self
class Parent(): def p(self): print(self) class Child(Parent): def c(self): print(self) c = Child() c.c() c.p() p = Parent() p.p() #<__main__.Child object at 0x02CE6270> #<__main__.Child object at 0x02CE6270> #<__main__.Parent object at 0x02CE6C90>
運行c.p()時,等同於Child.p(c),所以self指的依然是Child類的實例
描述符類中,self指的是描述符類的實例
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'>
這里調用的是t.x,也就是說是Test類的實例t的屬性x,由於實例t中並沒有定義屬性x,所以找到了類屬性x,而該屬性是描述符屬性,為Desc類的實例而已,所以此處並沒有頂用Test的任何方法。
參考資料:
http://python.jobbole.com/81921/
