-2

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

例子,

int age
int xyz

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

现在在上面的代码中, this.age并且this.xyz正在引用类变量。这两个变量是类变量,并且在方法之外声明abc,因此,这两个变量可以在类中的任何地方访问。

现在,如果我们谈论 Python,

Python 中的__init__方法是一个构造,如果我在其中声明任何变量__init__,那么它是否可以在其类中的任何位置访问——即使它是在方法中声明的——就像 Java 类变量一样?

例如,考虑这段代码,

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

变量agexyz在里面声明__init__,我可以在类的其他方法中访问它们Main吗?我可能知道答案是肯定的,但为什么答案是肯定的?变量是在方法内部声明的,而不是声明为类变量,那么它们如何被其他方法和其他类访问。

4

3 回答 3

3

__init__不,在as中定义事物self.xxx会使它们成为实例属性。在 Python 中,类属性只是在类上定义,在方法之外。

class MyClass(object):

    abc = 0
    xyz = 42

    def __init__(...)
        # and so on

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

于 2013-10-10T18:20:06.433 回答
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
>>>
于 2013-10-10T18:23:30.747 回答
1

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

于 2013-10-10T20:35:49.317 回答