已有183人关注
私有成员的访问与修改问题
发表在Python图书答疑 2018-07-25 悬赏:1 学分 《零基础学Python》第7章 面向对象程序设计 192页-193页
是否精华
版块置顶:
class Swan:
    
    __neck_swan = '天鹅的脖子很长'
    def __init__(self):
        print('__init__:',Swan.__neck_swan)
    def profile(self):
        print('方法中访问私有:',Swan.__neck_swan)
        
swan = Swan()
swan._Swan__neck_swan = '天鹅的脖子很long'
print('修改后:',swan._Swan__neck_swan)
swan.profile()

书上说,私有成员可以通过“实例名._类名__xxx”方式访问,那么我想问可不可以通过这种方式修改呢?比如我上面这段代码,用这种方法修改后,输出的属性确实变了,但是当我在调用后面的那个profile方法时,输出的还是原来的类属性,这又说明没有修改成功,所以到底能不能改呢?

还有如果可以通过这种方式访问的话,那private还有什么意义呢,跟用@property实现只读(194页)也没什么区别了啊

分享到:
精彩评论 1
无语_mrkj
学分:3155 LV11
2018-07-27
沙发

其实,通过_类名__xxx访问私有属性,是Python自动为以双下划线开头的属性所作的变形。这是由于在Python中实际上并没有严格的机制来阻止对类的“私有”属性进行访问。所以,当我们知道类和私有属性后,就可以通过“实例名._类名__xxx”方式访问。但是这种情况只适用在定义类时,不会发生在执行时,所以这种修改不会影响到profile方法。

总结:如果想改也可以,不过它不会影响类内部的其他方法,所以也不会影响类的安全。


首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照