我有下面的代码
class AccountBannk:
def __init__(self,balance,holder):
self.__AccountHolder=holder
def Display_AccountHolder(self):
print "account holder is" , self.__AccountHolder
myaccount=AccountBannk(100000,"mehdiebagvand")
#print myaccount.__AccountHolder #is a error
myaccount.__AccountHolder="ali"
print myaccount.__AccountHolder #print ali
在此代码中,AccountHolder是一个私有属性
在python中,我们不能直接编辑或打印它。
如果我们尝试下面的代码,python就会释放一个错误
print myaccount.__AccountHolder
但我的问题是
为什么python不在下面的代码中发布错误
myaccount.__AccountHolder="ali"
2-I打印我的账户。账户持有人在最后一行,但python不释放错误
并将myaccount的值更改为'ali'
这是我认为使用
__names
作为“私有变量”会带来更多麻烦的众多原因之一。__names
的预期用例更多的是允许层次结构中的类使用nice(ish)名称,而不用太担心层次结构中的其他类正在使用什么名称,而不是创建“private”属性。你知道吗对于“private”属性,只需使用单个前导下划线(如
_name
)。这记录了您的意图,即某些名称是私有实现细节,而其他名称是类的公共接口的一部分。它不会阻止任何人使用“private”名称,但也不会阻止__names
,因为这种损坏很容易进行反向工程。所有这些技巧都可以防止任何人意外地使用你想要保密的名字;他们可以做一些狡猾的事情,但他们必须知道自己在做。这就是Python中所能得到的一切;因为一切都是动态的,任何人都可以在任何时候做任何事情。你知道吗因此,私有内部名称的
__name
和_name
之间的主要区别在于,每当您开始想使用getattr
或hasattr
(即使在正确的类中)、动态附加方法,或者有一个子类不想共享“私有”名称时,__name
就会成为一个主要的PITA。带有一个下划线的_name
在这些方面都没有问题,在记录您的意图方面同样有效,在防止在类定义之外使用私有名称方面同样有效(即几乎完全无效)。你知道吗这不是虫子。当您在类中定义第一个
__AccountHolder
时,Python正在破坏变量的名称(这使得很难猜测,但不是真正私有的,请参见PEP-8)。当您附加第二个变量__AccountHolder
时,您正在创建一个新的变量(具有一个新的损坏名称)。试试看:或添加
在你完成第二项任务之前和之后,你可以这样做:
至于mangling这个名字,这里是来自文档:
相关问题 更多 >
编程相关推荐