2017-08-08 46 views
1

當我讀到這個tutorialtkinter爲我在Python中的GUI第一步,我意識到在__init__函數內部調用一個類函數。爲什麼在__init__中調用類函數時必須聲明自己?

我想了解,在__init__函數中調用類函數時,爲什麼要聲明self.class_function()

我發現下面這個答案,這只是說,它必須調用self.class_function而不是class_functionthis問題,但不提供有關爲什麼必須這樣做的任何概念或解釋:

class MyClass(): 
    def __init__(self, filename): 
     self.filename = filename 

     self.stat1 = None 
     self.stat2 = None 
     self.stat3 = None 
     self.stat4 = None 
     self.stat5 = None 
     self.parse_file() 

    def parse_file(self): 
     #do some parsing 
     self.stat1 = result_from_parse1 
     self.stat2 = result_from_parse2 
     self.stat3 = result_from_parse3 
     self.stat4 = result_from_parse4 
     self.stat5 = result_from_parse5 
+1

你必須調用類函數時使用的自我。因爲它有助於確定函數如何表現特定對象。它也有助於繼承。你可以在哪裏改變或重寫基類函數。此外,使用靜態方法的事實。你必須提供所有的實例信息給靜態函數,但是關於與對象關聯的私有類變量呢?你將如何將它們提供給靜態函數,這將是一種骯髒的習慣。 –

+3

您的示例不包含類方法。 'parse_file'是一個實例方法。 –

+1

如果你願意,你也可以稱它爲'MyClass.parse_file(self)' –

回答

3

我的理解是,您必須使用self.method_name而不是method_name調用方法的原因是因爲,在底層,Python將self部分替換爲方法的第一個參數。

您可以通過定義一個名爲Foo類測試這個自己:

foo = Foo() 
Foo.fun(foo) 

這將是一樣的表演:

class Foo: 
    def __init__(self): 
    self.fun() 
    def fun(self): 
    print("fun") 

您可以通過執行以下實際調用fun()方法self.fun()從班內。

請注意,你不能靜態地訪問私有字段(例如Foo._private_method(foo)

+0

另外,有關私有類變量的信息不能共享給靜態函數。 –

+0

@RajanChauhan,我剛剛編輯爲 – duper51

+0

@RajanChauhan呵呵?你什麼意思?如果你定義了一個'_private_method',那麼確定你可以。無論如何,Python並沒有真正的「私有方法」。 –

1

爲什麼在調用__init__函數中的類函數時必須聲明self.class_function()?

self.foo()指類的實例方法,而不是靜態的方法或從其他模塊的另一個方法......

以這種方式

你做的)其他語種的類似this.foo東西(在換句話說:self.foo()的意思是調用該對象的foo方法!

+1

「而不是靜態方法」否 - 將調用staticmethod,同樣,classmethods也會被調用。 –

相關問題