9

我来自Java,所以我在这里感到困惑。

class Sample(object):
    x = 100                     # class var?
    def __init__(self, value):
        self.y = value          # instance var?
        z = 300                 # private var? how do we access this outside Sample?

3个变量声明有什么区别?

4

3 回答 3

32
class Sample(object):
    x = 100      
    _a = 1
    __b = 11               
    def __init__(self, value):
        self.y = value      
        self._c = 'private'    
        self.__d = 'more private'
        z = 300         

在这个例子中:

  • x是类变量,
  • _a是私有类变量(通过命名约定),
  • __b是私有类变量(被解释器破坏),
  • y是实例变量,
  • _c是私有实例变量(按照命名约定),
  • __d是私有实例变量(被解释器破坏),
  • z是方法范围内的局部变量__init__

如果名称中有单下划线,则严格遵守约定。仍然可以访问这些变量。在双下划线名称的情况下,它们会被破坏。仍然可以绕过它。

于 2012-04-11T13:08:23.430 回答
3

@vartec 是正确的。但是,由于您来自 Java,因此需要进行一些澄清:

  • Java 有publicprivate成员。严格禁止访问private成员,这是由语言强制执行的。
  • Python 只有公共成员。没有办法强制执行诸如 java 的关键字之类的东西。private

    如果你想声明某事只是一个实现细节并且不应该被其他代码依赖,你可以在它前面加上一个下划线 - _variable, _function()。这是对其他程序员的一个提示,他们不应该使用该变量或该函数,但并未强制执行。

    看起来 Python 中省略了一个特性,但 Python 的文化是“每个人都是同意的成年人”。如果你告诉其他程序员某些东西是“私有的”,在它前面加上一个下划线,他们通常会接受这个提示。

于 2012-04-11T13:15:08.827 回答
1

你似乎已经掌握了窍门。唯一完全错误的是z = 300. 这是__init__方法的本地名称。Python永远不会self以 C++ 和 Java 假定的相同方式为您插入this

在继续学习 Python 时要记住的一件事是成员函数始终可以作为类成员执行。考虑以下:

>>> class Sample(object):
...   def __init__(self, value):
...     self.value = value
...   def get_value(self):
...     return self.value
...
>>> s = Sample(1)
>>> t = Sample(2)
>>> s.get_value()
1
>>> Sample.get_value(s)
1
>>> t.__class__.get_value(s)
1

最后三个例子都调用了对象的成员函数s。最后两个使用的事实get_value只是Sample类的一个属性,它期望接收一个实例Sample作为参数。

于 2012-04-11T13:11:22.247 回答