Java 类变量和 Python 中的__init__方法



我很久以前就用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的其他方法中访问它们吗?我可能知道答案是肯定的,但为什么答案是肯定的?变量是在方法中声明的,而不是声明为类变量,那么其他方法和其他类如何访问它们。

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

class MyClass(object):
    abc = 0
    xyz = 42
    def __init__(...)
        # and so on

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

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

在Python中,类是一个对象,"class attribute"实际上意味着类对象本身的属性 - 而不是类的实例。现在 Python 对象结构是动态的 - 您可以在每个实例的基础上在任何地方(是的,甚至是外部方法(添加(或删除(属性 - 而 Java 类具有固定的声明结构,这就是为什么在 Java 中您必须在类语句的正文中声明类的结构(它将具有哪些属性(,而在 Python 中,您通常在初始值设定项中这样做。

最新更新