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