Ⅰ 為什麼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是什麼
class Name():
def __init__(self, name):
self.name = name
def say(self):
print 'Hello, %s' % self.name
如果不用self,那該怎麼實現say(),非常難。
__inti__(self.name)叫做構造函數,凡是Name類的一個對象被創建,先運行構造函數,構造函數需要的參數就是類所需要的參數。 比如 a = Name('Ricky') 其實是 給__init__(self,name)提供參數。而self就說明是類的變數,類里別的函數也可以用的!
這是面向對象編程思路的一個瓶頸,希望你能弄懂。
Ⅲ python中self是什麼
python中的self就相當於C++中的this指針
也就是指向對象本身的指針
self.name = name 就是當前對象的成員變數name賦值為name。
Ⅳ 我解釋一下python的類方法為什麼要寫一個self參數
類(class)初始化之後會得到實例(instance)。
self就是用於代表初始化的到的實例。
明確地寫一個self參數,使得類的方法(method)和普通的函數(function)本質上沒有差異,所有的輸入參數都顯示地傳遞到方法/函數當中。
當然作為類的方法,作用的對象一定會是實例,因而在Python的設計之初,完全可以設計成self不作為一個參數,但是那樣就需要一個關鍵字代表實例,比如在javascript中就是this。
然而Python的哲學是"Explicit
is
better
than
implicit.",顯示要比隱示好,因此Python類的方法需要一個self參數代表實例是符合邏輯的。
Ⅳ 關於Python中的self
python中的self就相當於c++中的this指針
也就是指向對象本身的指針
self.name
=
name
就是當前對象的成員變數name賦值為name。
Ⅵ python中方法和函數的區別是什麼什麼時候要帶self
定義一個函數就是定義一個方法,self是自身,調用的時候如果需要傳入魔法方法__init__(初始定義的值【也就是參數】)時就需要帶self,不需要則可以在函數(即方法)前加修飾@staticmethod,就不用帶self參數了。
Ⅶ 關於python類中函數名前加self.的問題
self是對實例自己的引用。
self.a()的意思是"調用自己的過程a"。
試想,有定義一個函數a,同時,類中也有過程a,要區分兩者,在類中就要通過是否使用self前綴來區分,在外部就要通過是否有實例名來區分。
參考以下代碼:
Ⅷ python里的self是什麼意思
self就是一個指針。透明的指向當前類的實例。
顯示的將當前的類的實例進行傳遞。這就是python。不能用面向對象的理解去解釋它。
Ⅸ Python為什麼要self
晚上特別針對Python的self查了一下,理理。Python要self的理由Python的類的方法和普通的函數有一個很明顯的區別,在類的方法必須有個額外的第一個參數
(self
),但在調用這個方法的時候不必為這個參數賦值
(顯勝於隱
的引發)。Python的類的方法的這個特別的參數指代的是對象本身,而按照Python的慣例,它用self來表示。(當然我們也可以用其他任何名稱來代替,只是規范和標准在那建議我們一致使用self)為何Python給self賦值而你不必給self賦值?例子說明:創建了一個類MyClass,實例化MyClass得到了MyObject這個對象,然後調用這個對象的方法MyObject.method(arg1,arg2)
,這個過程中,Python會自動轉為Myclass.mehod(MyObject,arg1,arg2)這就是Python的self的原理了。即使你的類的方法不需要任何參數,但還是得給這個方法定義一個self參數,雖然我們在實例化調用的時候不用理會這個參數不用給它賦值。實例:class
Python:
def
selfDemo(self):
print
'Python,why
self?'p
=
Python()p.selfDemo()輸出:Python,why
self?把p.selfDemo()帶個參數如:p.selfDemo(p),得到同樣的輸出結果如果把self去掉的話,
class
Python:
def
selfDemo():
print
'Python,why
self?'p
=
Python()p.selfDemo()這樣就報錯了:TypeError:
selfDemo()
takes
no
arguments
(1
given)擴展self在Python里不是關鍵字。self代表當前對象的地址。self能避免非限定調用造成的全局變數。
Ⅹ 為什麼Python在類下定義函數要用self參數
一棟樓上所有房間都長的一毛一樣,在樓外面,你能分清是哪個房間,可一旦進入樓裡面,你就無法分清是304,還是406號房,而self就是這個門牌號。在程序中,它表明調用方法的對象是誰!