2013-05-12 43 views
6

我对我自己的学习Python类,现在和整个这个页面来了:Python类中的公共变量?

http://www.tutorialspoint.com/python/python_classes_objects.htm

变量empCount是一个类变量,其值将 一个此类的所有实例共享。这可以从课堂内部或课堂以外的 Employee.empCount进行访问。

我假设这被称为公共变量?或者一个静态的公共变量?

这是技术上的良好做法吗?我知道这个问题有点软,但总的来说,像self.var(在init或其他类中声明的)与像这样的公共变量一样的类变量是否更好?

+0

它简单地称为类属性。它们等同于C++的静态数据成员。 – 2013-05-12 17:47:00

回答

5

它被称为类属性。 Python不区分公共和私人;隐私只是按照惯例表示,并没有强制执行。

如果您需要在实例之间共享数据,这在技术上是很好的做法。请记住,方法也是类属性!

+0

所以如果我的程序是所有关于连接到远程API并拉入数据,将URL存储为“类属性”还是作为self.URL变量(对不起,我不知道你称之为什么) – 2013-05-12 17:48:28

+0

实例属性 - no , 不是真的。使用类属性作为默认值(在实例上设置相同的名称会掩盖类属性),需要在所有实例之间共享的状态,或创建新实例时需要更改的数据(例如计数器,以便为每个实例生成唯一的ID )。 – 2013-05-12 18:20:00

1

区别在于,如果变量是在__init__构造函数中声明的,则变量对于不同的类变量表示不同。 (即)如果该类有两个对象,则每个变量都有不同的内存空间。如果声明为empcount,则该类的所有对象将共享或访问相同的内存空间。在这种情况下,创建的每个对象都会将empcount的值增加1。因此,当一个变量要被所有对象共享时,请使用这种静态声明。但是改变这个变量会影响类的所有对象。

+0

因此,即使许多对象可能在类中实例化并且empcount = 0,它只会在第一次实例化类时被初始化为0(然后通过init增加1)? – 2013-05-12 17:53:32

+0

是的。无论何时调用构造函数,empcount值都会增加1,因此'empcount'值会给出类的对象数量。 – 2013-05-12 17:55:00

+0

如上所述,这相当于初始化静态变量c – 2013-05-12 18:08:23