我有一个列表--myList--每个元素都是一个字典。我想重复这个列表,但我只对每一次字典中的一个属性“age”感兴趣。我也对计算迭代次数感兴趣。
我知道:
for i, entry in enumerate(myList):
print i;
print entry['age'];
python中的私有变量或多或少是一种破解:解释器故意重命名变量。
class A:
def __init__(self):
self.__var = 123
def printVar(self):
print self.__va
现在,如果您尝试__var在类定义之外访问,它将失败:
>>>x = A()
>>>x.__var # this will return error: "A has no attribute __var"
>>>x.printVar() # this gives back 123
但是,你可以轻易摆脱这个:
>>>x.__dict__ # this will show everything that is contained in object x
# which in this case is something like {'_A__var' : 123}
>>>x._A__var = 456 # you now know the masked name of private variables
>>>x.printVar() # this gives back 456
你可能知道在OOP中的方法是这样调用的:x.printVar() => A.printVar(x)如果A.printVar()可以访问某个字段x,这个字段也可以在外部 访问A.printVar()...毕竟函数是为了重用而创建的,没有特别的权力赋予里面的语句。
涉及编译器时,游戏是不同的(隐私是编译器级别的概念)。它使用访问控制修饰符知道类的定义,所以如果在编译时没有遵循这些规则,就会出错
这是文化。在Python中,您不会写入其他类的实例或类变量。在Java中,如果你真的想要做什么,就不会有什么妨碍- 毕竟,你总是可以编辑类本身的源码来达到同样的效果。Python放弃了安全的伪装,并鼓励程序员负责。在实践中,这很好地工作。
如果您想由于某种原因来模拟私有变量,则可以始终使用PEP 8中的__前缀。Python把变量的名字弄乱了,所以在包含它们的类之外,它们不容易被看到,以便进行编码(尽管如果你足够坚决,你可以绕过它,就像你可以绕过Java的保护一样)。__foo
按照同样的惯例,即使你在技术上没有被阻止,_前缀意味着远离。你不玩弄另一个类的变量看起来像__foo或_bar。