2013-10-10 31 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中,通常在初始化器中这样做。