self代表的是類的例項,而不是類
class test(object):
def prt(self):
print(self)
print(self.__class__)
t = test()
t.prt()
執行結果:
<__main__.test object at 0x10fe90fd0>
從上面的執行結果可以看出,self指向是類的例項物件,self.__class__指向的類
self是必寫的?
在python直譯器內部,當我們呼叫t.prt()時,實際上直譯器解釋為test.prt(t),也就是說把self替換成類的例項
class test(object):
def prt(self):
print(self)
print(self.__class__)
t = test()
# t.prt()
test.prt(t)
**與上面**執行結果一樣。
實際上self是不可以省略的
class test(object):
def prt():
# print(self)
# print(self.__class__)
print('aaa')
t = test()
t.prt()
執行結果:
typeerror: prt() takes 0 positional arguments but 1 was given
prt()方法在定義時沒有定義引數,但是我們執行時強行傳了乙個引數,等同於我們傳了乙個引數t。
如果我們定義和呼叫時均不傳類例項是可以的,這就是類方法:
class test(object):
def prt():
# print(self)
# print(self.__class__)
print('aaa')
t = test()
# t.prt()
test.prt()
執行結果為:aaa
在繼承時,傳入的是哪個例項,就是那個傳入的例項,而不是定義了self類的例項
class parent:
def p(self):
print(self)
class child(parent):
def c(self):
print(self)
cl = child()
cl.c()
cl.p()
pa = parent()
pa.p()
執行結果:
<__main__.child object at 0x107cf4e90>
<__main__.child object at 0x107cf4e90>
<__main__.parent object at 0x107cf4e10>
執行cl.p()時,相當於child.p(cl),所以self指的是child類的例項,由於child中沒有定義p(),所以會沿著繼承樹往上找,在parent類中有p()方法,所以就會成功呼叫
在描述符類中,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 0x105c26dd0>
self in desc: <__main__.desc object at 0x105c26d10>
<__main__.desc object at 0x105c26d10> <__main__.test object at 0x105c26dd0>
此處呼叫的是t.x,也就是說是test類的例項t的屬性x,由於例項t中並沒有定義屬性x,所以找到了類屬性x,而該屬性是描述符屬性,為desc類的例項而已,所以此處並沒有頂用test的任何方法。
那麼我們如果直接通過類來呼叫屬性x也可以得到相同的結果。
下面是把t.x改為test.x執行的結果。
self in test: <__main__.test object at 0x10334cdd0>
self in desc: <__main__.desc object at 0x10334cd10>
<__main__.desc object at 0x10334cd10> none
python中的self理解
前言 先介紹下類和例項 物件導向最重要的概念就是類 class 和例項 instance 類時抽象的模板,比如學生這個抽象的事物,可以用乙個student類來表示。而例項時根據類建立出來的乙個個具體的 物件 每乙個物件都從類中繼承有相同的方法,但各自的資料可能不同 根據各自的引數來定 1 class...
關於python中self的理解
self可以這麼理解 class就是表示 汽車 然後 init 是一些汽車的基本定義,比如要有發動機,要有方向盤 在這個定義的過程中,可能需要一種引用,比如現在北京要求汽車都要裝自檢測系統,監測系統統計資料必定是某一輛車它自身的,是乙個 例項 邦定的行為,你的檢測功能不會也不允許去收集其他汽車的資料...
聊聊python類中的self
在學習python類的時候會發現幾乎無一例外的會傳入引數self,self到底是什麼呢?其實 如下 class test def prt self print self print self.class t test t.prt 結果為 main test object at 0x104b6d410...