2013-10-10 61 views
-2
__init__方法

我在Java不久前編碼,我記得class關鍵字如何能在班裏的任何方法裏面訪問,的Java類的變量和Python中

例,

int age 
int xyz 

public void abc(int aga,int xyz) { 
    this.age = age; 
    this.xyz = xyz; 
} 

現在在上面的代碼中, this.agethis.xyz引用了類變量。 這兩個變量是類變量,並已在方法abc, 之外聲明,因此,這兩個變量可以在類中的任何位置訪問。

現在,如果我們談論的Python,

在Python中__init__方法就是建構, 如果我宣佈__init__內的任何變量,那又是訪問其類的任意位置, - 即使它的內部聲明一個方法 - 就像Java類變量一樣?

例如, 考慮以下代碼,

Class Main: 
    def __init__(self): 
      self._age = None 
      self._xyz = None 

變量agexyz在裏面__init__聲明,我可以訪問他們在類Main其它方法嗎? 我可能知道答案是肯定的,但爲什麼答案是肯定的? 這些變量是在一個方法內部聲明的,而不是聲明爲類變量,那麼他們怎樣才能被其他方法和其他類訪問。

+3

你試過了嗎? –

+0

是的,我試過了,這就是爲什麼我問。因爲在java中,這個變量是用來當我們訪問類變量,但在Python中沒有必要在上面的代碼中寫自己。在我的代碼中(我正在學習),變量age和xyz從未在類中聲明過(只在__init__中聲明),但是可以在其他類中訪問它們。 –

+2

是的,你可以。只要將它引用爲'self._age' – karthikr

回答

2

__init__中的所有屬性都是實例屬性。這意味着,在創建類的實例時,它們可用於該實例。

通過執行self.<attribute>,可以通過self(與Java中的this相同)引用它們。請參見下面的演示:

>>> class Main: 
...  def __init__(self): 
...   self._age = None 
...   self._xyz = None 
...  def method(self): 
...   print self._age, self._xyz 
... 
>>> test = Main() 
>>> test.method() 
None None 
>>> 
3

否。將__init__中的內容定義爲self.xxx使它們成爲實例屬性。在Python中,類屬性只是在方法外的類上定義。

class MyClass(object): 

    abc = 0 
    xyz = 42 

    def __init__(...) 
     # and so on 

這些都可以在任何方法內使用例如,只要不存在名爲abc的實例屬性。如果存在,則實例屬性優先。即使在這種情況下,您也可以使用type(self).abc訪問類屬性。

1

在Python一類是對象和「類屬性」的真正含義類對象本身的屬性 - 不是的類的實例。現在,Python對象結構是動態的 - 您可以在每個實例的基礎上添加(或刪除)任何屬性(是,甚至是外部方法) - 而Java類具有固定的聲明結構,這就是爲什麼在Java中必須聲明在類聲明的正文中,類的結構(它具有屬性);而在Python中,通常在初始化器中這樣做。