谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Python:为什么类中的私有属性可以在外部赋值并访问?
问题引入
在慕课网上学习Python**类中的私有属性**的时候,看到了一个同学的提问:
将count改为__count,为什么实例变量在外部仍然可以修改__count?这里printp1.__count可以打印出100
classPerson(object): __count=0 def__init__(self,name): Person.__count=Person.__count+1 self.name=name printPerson.__count p1=Person('Bob') p1.__count=100 printp1.__count p2=Person('Alice') printPerson.__count
问题解决:
单刀直入版:
这是因为给p1.__count赋值的操作,其实是在p1中定义了一个名为__count的变量(因为Python中的都是动态变量),而没有改变类中真正的属性。
太长但还是要看看版:
知识点清单:
1、类的“伪私有属性”
2、在类的外部动态地创建类属性
问题解决过程:
1、“伪私有属性”的概念:
python的类中通过加双下划线来设置的“私有属性”其实是“伪私有属性”,原理是python编译器将加了双下划线的“属性名”自动转换成“类名属性名”。所以我们在外部用“属性名”访问私有属性的时候,会触发AttributeError,从而实现“私有属性”的特性。但通过“类名属性名”也可以访问这些属性。
参考:http://www.pythonclub.org/python-class/private
2、编写测试代码:
以下是在该同学的代码的基础上修改的测试代码:
classPerson(object): #设置类属性 __count_of_class='originalcount_of_class' def__init__(self,name): self.name=name print('inclassPerson:count_of_class=',Person.__count_of_class,'\n') #初始化实例p1 p1=Person('Bob') #在实例p1上修改属性值 p1.__count_of_class='I\'mnottheoriginalcount_of_class!' print('p1\'s_Person__count_of_class=',p1._Person__count_of_class) print('p1\'s__count_of_class=',p1.__count_of_class,'\n') #在类Person上修改属性值 Person.__count_of_class='I\'mnottheoriginalcount_of_class!' #将这句注释取消掉,会发现真正的私有属性的值也改变了 #Person._Person__count_of_class='I\'mnottheoriginalcount_of_class!' print('Person\'s_Person__count_of_class=',Person._Person__count_of_class) print('Person\'s__count_of_class=',Person.__count_of_class)
分别在实例p1上和类Person上进行操作,并且分别打印出“__属性名”,以及“_类名__属性名”。
输出结果如下:
inclassPerson:count_of_class=originalcount_of_class p1's_Person__count_of_class=originalcount_of_class p1's__count_of_class=I'mnottheoriginalcount_of_class! Person's_Person__count_of_class=originalcount_of_class Person's__count_of_class=I'mnottheoriginalcount_of_class!
**由此可见,虽然用p1.__count_of_class给它赋值了,但其实在类中真正的属性_Person__count_of_class的原始值是没有改变的。
但是如果将p1._Person__count_of_class赋值,那么类属性定义的原始值就真正地被覆盖了**
""" 取消掉 ##Person._Person__count_of_class='I\'mnottheoriginalcount_of_class!' 的注释,输出结果: """ inclassPerson:count_of_class=originalcount_of_class p1's_Person__count_of_class=originalcount_of_class p1's__count_of_class=I'mnottheoriginalcount_of_class! #注意这一句: Person's_Person__count_of_class=I'mnottheoriginalcount_of_class! Person's__count_of_class=I'mnottheoriginalcount_of_class!
由此,我们知道了:_count_of_class和_Person_count_of_class不是同一个东西。
最后的问题
但是呢,如果不先给p1.__count_of_class赋值,直接打印它又会触发AttributeError,这是为什么?
这是因为给p1.__count_of_class赋值的操作,其实是在p1中定义了一个名为__count_of_class的变量(因为Python中的都是动态变量)。
以下实例说明可以通过外部赋值来为类创造属性:
classPerson(object): pass p1=Person() #给p1创建属性new_of_instance p1.new_of_instance='I\'mnewinp1!' print(p1.new_of_instance) #给Person类创建属性new_of_class Person.new_of_class='I\'mnewinPerson!' #在类中新加的属性,可以通过实例来访问 print(p1.new_of_class) >>>输出: I'mnewinp1! I'mnewinPerson!
问题解决。
以上这篇谈谈Python:为什么类中的私有属性可以在外部赋值并访问就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。