Java类变量& Python中的__init__方法

时间:2013-10-10 18:12:05

标签: java python python-3.x

我很久以前用Java编写代码,我记得如何在类中的任何方法中访问class关键字,

实施例,

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 :(得分:3)

没有。将__init__中的内容定义为self.xxx会使它们成为实例属性。在Python中,类属性只是在方法之外的类上定义。

class MyClass(object):

    abc = 0
    xyz = 42

    def __init__(...)
        # and so on

这些可以在任何使用例如方法的方法中达到。只要没有名为self.abc的实例属性,abc。如果存在,则实例属性优先。即使在这种情况下,您也可以使用type(self).abc访问class属性。

答案 1 :(得分:2)

__init__中指定的所有属性都是实例属性。这意味着,在创建类的实例时,它们可用于该实例。

您可以通过self通过this(与Java中的self.<attribute>相同)引用它们。请参阅下面的演示:

>>> 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
>>>

答案 2 :(得分:1)

在Python中,类是一个对象,“类属性”实际上是指类对象本身的属性 - 而不是类的实例。现在Python对象结构是动态的 - 您可以在每个实例的任何地方添加(或删除)属性(是的,甚至是外部方法) - 而Java类具有固定的,声明的结构,这就是为什么在Java中你必须声明类的结构(它将具有哪些属性)在类语句的主体中,而在Python中,通常在初始化器中执行此操作。