問題Python __init__和self他們做瞭什麼? - 程式設計討論

文章推薦指數: 80 %
投票人數:10人

def method(self, blah): def __init__(?): .... .... 是什麼 self 做?這是什麼意思?這是強制性的嗎? 什麼是 __init__ 方法呢?為什麼有必要? (等等。

). adabai.com Togglenavigation 問題討論 問題Python__init__和self他們做瞭什麼? 我正在學習Python編程語言,而且我遇到瞭一些我不太瞭解的東西。

在如下方法中: defmethod(self,blah): def__init__(?): .... .... 是什麼self 做?這是什麼意思?這是強制性的嗎? 什麼是__init__ 方法呢?為什麼有必要?(等等。

) 我認為它們可能是OOP結構,但我不太瞭解。

4234 2018-03-0905:09 起源 答案: 在這段代碼中: classA(object): def__init__(self): self.x='Hello' defmethod_a(self,foo): printself.x+''+foo ......self variable表示對象本身的實例。

大多數面向對象的語言都將此作為隱藏參數傳遞給對象上定義的方法;Python沒有。

你必須明確聲明它。

當您創建一個實例時A 類和調用它的方法,它將自動傳遞,如... a=A()#Wedonotpassanyargumenttothe__init__method a.method_a('Sailor!')#Weonlypassasingleargument 該__init__ method大致代表Python中的構造函數。

你打電話時A() Python為您創建一個對象,並將其作為第一個參數傳遞給__init__ 方法。

任何其他參數(例如,A(24,'Hello'))也將作為參數傳遞-在這種情況下會引發異常,因為構造函數不期望它們。

461 2018-03-0905:18 有什麼意義呢object 在課堂宣言中?我註意到有些課程有這個,有些沒有-Chris@Chris它適用於Python2兼容性。

在Python3中,不需要顯式繼承object 因為它默認發生。

-Gabriel 答案: 在這段代碼中: classA(object): def__init__(self): self.x='Hello' defmethod_a(self,foo): printself.x+''+foo ......self variable表示對象本身的實例。

大多數面向對象的語言都將此作為隱藏參數傳遞給對象上定義的方法;Python沒有。

你必須明確聲明它。

當您創建一個實例時A 類和調用它的方法,它將自動傳遞,如... a=A()#Wedonotpassanyargumenttothe__init__method a.method_a('Sailor!')#Weonlypassasingleargument 該__init__ method大致代表Python中的構造函數。

你打電話時A() Python為您創建一個對象,並將其作為第一個參數傳遞給__init__ 方法。

任何其他參數(例如,A(24,'Hello'))也將作為參數傳遞-在這種情況下會引發異常,因為構造函數不期望它們。

461 2018-03-0905:18 有什麼意義呢object 在課堂宣言中?我註意到有些課程有這個,有些沒有-Chris@Chris它適用於Python2兼容性。

在Python3中,不需要顯式繼承object 因為它默認發生。

-Gabriel 是的,你是對的,這些是oop結構。

__init__ 是類的構造函數。

該self 參數是指對象的實例(如this 在C++)。

classPoint: def__init__(self,x,y): self._x=x self._y=y 該__init__ 在分配對象的內存時調用方法: x=Point(1,2) 使用它很重要self 如果要使用對象保留值,則在對象的方法內部使用參數。

例如,如果你實現瞭__init__ 像這樣的方法: classPoint: def__init__(self,x,y): _x=x _y=y 你的x 和y 參數將存儲在堆棧中的變量中,並在init方法超出范圍時被丟棄。

將這些變量設置為self._x 和self._y 將這些變量設置為Point 對象(可在對象的生命周期內訪問)。

184 2018-03-0905:18 一個簡短的例子 希望它可能會有所幫助,這裡有一個簡單的例子我用來理解在類中聲明的變量和在一個內部聲明的變量之間的區別。

__init__ 功能: classMyClass(object): i=123 def__init__(self): self.i=345 a=MyClass() printa.i 345 printMyClass.i 123 138 2018-06-2312:15 有趣的觀察,但我認為你走錯瞭路。

使用printMyClass.i,它看起來更像是在調用'靜態'變量i。

與a.i一樣,你在調用成員變量,i。

在我看來,這在裡面 隻是在創建類的對象時首先執行的構造函數。

-captainspi這就是我試圖用這個例子“向自己解釋”-由變量設置的變量__init__ 是什麼傳遞給實例 類的,而不是具有相同名稱的類本身的'static'變量...-DaveEveritt 簡而言之: self 正如它所暗示的,指的是本身-調用該方法的對象。

也就是說,如果您有N個對象調用該方法,那麼self.a 將為每個N個對象引用變量的單獨實例。

想象一下變量的N個副本a 對於每個對象 __init__ 是其他OOP語言(如C++/Java)中的構造函數。

基本的想法是它是一個特別 在創建該類的對象時自動調用的方法 36 2018-03-0905:41 __init__ 確實像一個構造函數。

如果您希望它們表現為非靜態方法,則需要將“self”傳遞給任何類函數作為第一個參數。

“self”是您班級的實例變量。

24 2018-03-0905:18 'self'定義方法是否是靜態的!哇,這對這個java傢夥大開眼界。

-liwevire 試試這段代碼。

希望它能幫助像我這樣的許多C程序員學習Py。

#!/usr/bin/python2 classPerson: '''Doc-InsideClass''' def__init__(self,name): '''Doc-__init__Constructor''' self.n_name=name defshow(self,n1,n2): '''Doc-InsideShow''' printself.n_name print'Sum=',(n1+n2) def__del__(self): print'DestructorDeletingobject-',self.n_name p=Person('Jay') p.show(2,3) printp.__doc__ printp.__init__.__doc__ printp.show.__doc__ 輸出: Jay Sum=5 Doc-InsideClass Doc-__init__Constructor Doc-InsideShow DestructorDeletingobject-Jay 20 2018-05-1003:03 我不知道這隻是我,但閱讀這段代碼有點令人困惑。

也許是因為我還是一名新手Python程序員,idk。

-DavidWhite 我自己也遇到瞭麻煩。

即使在這裡閱讀瞭答案。

要正確理解__init__ 你需要瞭解自我的方法。

自我參數 接受的論點是__init__ 方法是: def__init__(self,arg1,arg2): 但我們實際上隻傳遞瞭兩個參數: instance=OurClass('arg1','arg2') 額外的爭論來自哪裡? 當我們訪問對象的屬性時,我們通過名稱(或通過引用)來訪問它們。

這裡的實例是對我們新對象的引用。

我們使用instance.printargs訪問實例對象的printargs方法。

為瞭從中訪問對象屬性__init__ 方法我們需要對對象的引用。

每當調用一個方法時,都會將對主對象的引用作為第一個參數傳遞。

 按照慣例,你總是將這個第一個參數稱為你的方法self。

這意味著在__init__ 我們可以做的方法: self.arg1=arg1 self.arg2=arg2 這裡我們在對象上設置屬性。

 您可以通過執行以下操作來驗證這一點: instance=OurClass('arg1','arg2') printinstance.arg1 arg1 像這樣的值稱為對象屬性。

在這裡__init__ method設置實例的arg1和arg2屬性。

資源:http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method 19 2018-01-0922:39 註意self 實際上可能是任何有效的python標識符。

例如,我們可以從ChrisB的例子中輕松寫出來: classA(object): def__init__(foo): foo.x='Hello' defmethod_a(bar,foo): printbar.x+''+foo 它的工作方式完全相同。

但是建議使用self,因為其他pythoners會更容易識別它。

16 2018-03-0912:50 我同意自己會被推薦代替foo,幫助其他程序員查看代碼-DavidWhite 熱門問題 如何計算git中兩次提交之間更改的行數? 如何使用$scope。

$watch和$scope。

$在AngularJS中申請? 如何清除SQLServer事務日志? 在Python中手動引發(拋出)異常 AngularJS:服務與提供商vs工廠 關於捕獲任何異常 PHP解析/語法錯誤;以及如何解決它們? %~dp0是什麼意思,它是如何工作的? 如何將命令行參數傳遞給批處理文件? 我可以將多個MySQL行連接到一個字段中嗎? 使用CSS替代表格行顏色? 從IList或IEnumerable創建逗號分隔列表 有人可以在Python中解釋__all__嗎? 為什麼我的講師寫的所有C文件都以#開頭? 為什麼不使用Double或Float來表示貨幣? 如何使用可點擊標簽創建HTML復選框 Xcode5中缺少ProvisioningProfiles菜單項 如何運行PowerShell腳本? 使用Gitpush部署項目 如何重命名本地Git分支? licensedunderccby-sa3.0 withattribution. 隱私政策 往來



請為這篇文章評分?