Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的成员或类变量_Python_Variables - Fatal编程技术网

python中的成员或类变量

python中的成员或类变量,python,variables,Python,Variables,我来自爪哇,所以我在这里感到困惑 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

我来自爪哇,所以我在这里感到困惑

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个变量声明之间的区别是什么

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
    是类变量
  • \u a
    是私有类变量(根据命名约定)
  • \u b
    是私有类变量(被解释器损坏)
  • y
    是实例变量
  • \u c
    是私有实例变量(根据命名约定)
  • \uu d
    是私有实例变量(被解释器损坏)
  • z
    方法范围内的局部变量
    

如果名称中只有一个下划线,则严格按照惯例。仍然可以访问这些变量。在双下划线名称的情况下,它们会被损坏。还是有可能绕过这一点的

你似乎已经掌握了窍门。唯一一个你完全错误的是
z=300
。这是
\uuu init\uu
方法的本地名称。Python <强>绝对> <强> >以C++和java将假设代码< >代码> > > > />代码> 在继续学习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\u value
只是
Sample
类的一个属性,该类希望接收
Sample
的一个实例作为参数。

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

  • Java有
    public
    private
    成员。严禁访问
    private
    成员,这是由语言强制执行的
  • Python只有公共成员。有没有方法来强制执行类似java的
    private
    关键字的东西

    如果您想声明某个内容只是一个实现细节,不应该被其他代码依赖,那么可以在它前面加一个下划线-
    \u变量
    \u函数()
    。这是对其他程序员的一个提示,他们不应该使用那个变量或那个函数,但它不是强制的

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


不过,dunderscore很少在Python中使用。通常只在变量前面加一个下划线,表示该变量是供内部使用的。我只是说,很多实际的Python代码没有使用这种“强制”,因为它没有真正的优势。是的,您可以通过
self轻松访问它。_Class\u variable
@vartec:exforced在这里是一个强有力的词。它实际上只是名称损坏。相关引用自:“仅对非公共方法和实例变量使用一个前导下划线。为避免与子类的名称冲突,请使用两个前导下划线来调用Python的名称损坏规则。”它不比单个下划线更私密。@John:不,dunderscore导致解释器启用名称混乱,请查看链接。但是他们有相同的意图:标记变量供内部使用。重复,重复,重复。。。很多很多问题都是这样的,很多很多完整的文档。@ChrisMorgan:如果你要称之为“重复”,至少要找到重复答案中最好的一个,并在这里发布一个链接。要选择几个例子来演示这个问题的所有要点,谢谢。我看到一篇文章说,通过创建init method的局部变量,它就像一个私有变量(类似于Java)。但是我在其他地方找不到访问z的方法。而且,我丢失了那篇文章的链接(从技术上讲,您可以创建一个真正的private,您只需通过重写
\uuu setattr\uuu()
来破坏您的类,以便在试图从类本身外部设置给定值时抛出错误。当然,这是非常不符合Python的,但是如果您想将Python Java化(我有一位经理在以前的工作中强迫我们这么做),你可以做到。@sr2222:我说话的时候在角落里前后摇晃。呃。@liangyip我相信有一位政治公众人物说这是对这种做法的正确反应。@sr2222:我敢打赌,你也可以绕过它。“如果它运行,它可以被黑客攻击。”