我来自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变量声明有什么区别?
答案 0 :(得分:21)
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__
方法范围内的局部变量。 如果名称中有单个下划线,则严格来说是一种约定。仍然可以访问这些变量。如果是双下划线名称,它们会被破坏。它仍然可以规避这一点。
答案 1 :(得分:2)
@vartec就是现货。但是,由于您来自Java,因此需要进行一些澄清:
public
和private
个成员。严格禁止访问private
成员,并使用该语言强制执行。 Python只有公共成员。 没有方法可以强制执行类似java的private
关键字。
如果您想声明某些内容只是一个实现细节而不应该被其他代码所依赖,那么您可以在其前面添加一个下划线 - _variable
,_function()
。对于其他程序员来说,这是提示,他们不应该使用该变量或该函数,但未强制执行。
似乎Python中已经省略了一个功能,但Python中的文化是“每个人都是同意的成年人”。如果你通过在下面添加一个下划线来告诉其他程序员某些东西是“私有的”,他们通常会提示。
答案 2 :(得分: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
的实例作为参数。