Ⅰ 為什麼python必須在方法定義和調用中顯式使用「self」
為什麼Python必須在方法定義和調用中顯示使用「self」?
這個想法借鑒了 Mola-3 語言。出於多種原因它被證明是非常有用的。
首先,更明顯的顯示出,使用的是方法或實例屬性而不是局部變數。
閱讀self.x或self.meth()可以清楚地表明,即使您不知道類的定義,也會使用實例變數或方法。
在 C++ 中,可以通過缺少局部變數聲明來判斷(假設全局變數很少見或容易識別) —— 但是在 Python 中沒有局部變數聲明,所以必須查找類定義才能確定。
一些 C++ 和 java 編碼標准要求實例屬性具有m_前綴,因此這種顯式性在這些語言中仍然有用。
其次,這意味著如果要顯式引用或從特定類調用該方法,不需要特殊語法。
在 C++ 中,如果你想使用在派生類中重寫基類中的方法,你必須使用::運算符 -- 在 Python 中你可以編寫baseclass.methodname(self, <argumentlist>)。
這對於__init__()方法非常有用,特別是在派生類方法想要擴展同名的基類方法,而必須以某種方式調用基類方法時。
最後,它解決了變數賦值的語法問題:
為了 Python 中的局部變數(根據定義!)在函數體中賦值的那些變數(並且沒有明確聲明為全局)賦值,就必須以某種方式告訴解釋器一個賦值是為了分配一個實例變數而不是一個局部變數,它最好是通過語法實現的(出於效率原因)。
C++ 通過聲明來做到這一點,但是 Python 沒有聲明,僅僅為了這個目的而引入它們會很可惜。
使用顯式的self.var很好地解決了這個問題。類似地,對於使用實例變數,必須編寫self.var意味著對方法內部的非限定名稱的引用不必搜索實例的目錄。
換句話說,局部變數和實例變數存在於兩個不同的命名空間中,您需要告訴 Python 使用哪個命名空間。
更多Python問答知識,請關注Python視頻教程!!
Ⅱ 用python定義類時候,用self定義,但是調用的時候顯示沒有我我定義的參數,求大佬解答一下
你的init方法寫錯了
是雙下劃線
__init__
Ⅲ Python中self的使用
如果你學過C++或者java的話,self就同this指針,表示當前正在被調用的這個對象
Ⅳ Python的類中引用成員變數必須加self嗎
Python的類中引用成員變數必須加self
類(class)初始化之後會得到實例(instance)。 self就是用於代表初始化的到的實例。 明確地寫一個self參數,使得類的方法(method)和普通的函數(function)本質上沒有差異,所有的輸入參數都顯示地傳遞到方法/函數當中。 當然作為類的方法,作用的對.
self是只有在類中才會有的。self在定義類的方法時是必須有的,雖然在調用時不必傳入相應的參數。 但self的名稱並不是一定的,在python中self不是關鍵詞。在初始化函數中可以把self換成任意名字.
Ⅳ 用python定義類的時候用self定義,但是調用的時候他顯示沒有我定義的參數,求各位大佬解答
你init裡面試pos=t,但是你沒有傳進去t啊,改成self.pos=pos
Ⅵ python cls不能調用self的變數么
普通的方法,第一個參數需要是self,它表示一個具體的實例本身。
如果用了staticmethod,那麼就可以無視這個self,而將這個方法當成一個普通的函數使用。
而對於classmethod,它的第一個參數不是self,是cls,它表示這個類本身。
>>> class A(object):
def foo1(self):
print "Hello",self
@staticmethod
def foo2():
print "hello"
@classmethod
def foo3(cls):
print "hello",cls
>>> a = A()
>>> a.foo1() #最常見的調用方式,但與下面的方式相同
Hello <__main__.A object at 0x9f6abec>
>>> A.foo1(a) #這里傳入實例a,相當於普通方法的self
Hello <__main__.A object at 0x9f6abec>
>>> A.foo2() #這里,由於靜態方法沒有參數,故可以不傳東西
hello
>>> A.foo3() #這里,由於是類方法,因此,它的第一個參數為類本身。
hello <class '__main__.A'>
>>> A #可以看到,直接輸入A,與上面那種調用返回同樣的信息。
<class '__main__.A'>
Ⅶ python類中self的問題
原因都出在第4行這句: test3.count += 1 #!!!注意此處不是self.count
你每運行一次 init() 函數 count 就會累加一
注意 你累加的是 test3.count 而不是 self.count
所以 運行了三次 init() 函數 的輸出是 1 2 3
如果 你累加的是 self.count 就會輸出三次 1 1 1
***首先要理解上面所說的 再繼續看下面的***
既然如此 print(cc3.count,cc4.count) #返回2,2 就是正確的
cc3.count 指向的 test3().count 輸出的是 2 沒異議是吧
cc4.count 指向的也是 test3().count 為什麼不是 2 都是同一個東西
print(cc3.count,cc4.count) #返回3,6
前面第一個3 就不用多說了
後面的第二個6 是因為你 cc4.count=6 這句指定了他是6
比如 a = 6 輸出a會是什麼? 當然是6啊
Ⅷ Python如何調用自定義類中的函數
你好:
你要在自定義的函數裡面的第一個參數設置為:
self
這是python約定的;
調用的時候可以不用管它,它相當於this!
Ⅸ 關於Python中的self
python中的self就相當於c++中的this指針
也就是指向對象本身的指針
self.name
=
name
就是當前對象的成員變數name賦值為name。
Ⅹ 關於python類中函數名前加self.的問題
self是對實例自己的引用。
self.a()的意思是"調用自己的過程a"。
試想,有定義一個函數a,同時,類中也有過程a,要區分兩者,在類中就要通過是否使用self前綴來區分,在外部就要通過是否有實例名來區分。
參考以下代碼: