python基礎===self的理解


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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM