鱼C论坛

 找回密码
 立即注册
查看: 903|回复: 13

[已解决]python中关于类的封装

[复制链接]
发表于 2022-1-8 10:03:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
类的封装中,有教学视频中说,改变某个对象对应的属性名就可以隐藏对象的属性,在通过getter方法调用和setter方法修改名字就可以避免数据的安全性,避免被修改。
但是,换一个属性名字并不影响直接对对象的修改啊。。。那以上那些很复杂的一堆函数有什么作用呢?
class Dog:
    '''
        传说中,改变属性名就可以隐藏属性
    '''
    def __init__(self,name):
        self.hidden_name = name
    def say(self):
        print('大家好,我是%s'%self.hidden_name)
    def get_name(self):     # 用getter方法才能调用属性名
        return self.hidden_name
    def set_name(self,name):
        self.hidden_name = name   # 用setter方法才能修改属性名
        
D1 = Dog('xiaohei')
print(D1.get_name())
#但是,我完全可以直接修改啊。。。,例如:
D1 = Dog('xiaobai')
D1.say()
#再或者:
D1.hidden_name = 'xiaobai'
最佳答案
2022-1-8 11:05:06
fledgling 发表于 2022-1-8 10:57
用了呀,第9行和第11行

这两个是类的默认方法,
你那个是自己定义的,虽然实现的结果是一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-8 10:20:00 | 显示全部楼层
你这不是修改属性值吗?
我话是有点没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-8 10:28:00 | 显示全部楼层
大马强 发表于 2022-1-8 10:20
你这不是修改属性值吗?
我话是有点没看懂

教学视频中说,改变一个属性名就可以避免属性值被修改。但是,我修改了属性名后,属性值仍然很容易就被修改了,完全没必要有什么getter方法和setter方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:34:31 | 显示全部楼层
你这属性名不是一直都是 self.hidden_name 吗?我去看下资料
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-8 10:37:56 | 显示全部楼层
大马强 发表于 2022-1-8 10:34
你这属性名不是一直都是 self.hidden_name 吗?我去看下资料

普通的,没有修改的名字是self.name = name,视频中说,变为self.hidden_name = name,就可以避免属性值被直接修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:42:33 | 显示全部楼层
class Dog:
    def __init__(self, food) -> None:
        self.__food = food
    @property
    def get_food(self):
        return self.__food

dog = Dog('🐟')
print(dog.get_food)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:42:38 | 显示全部楼层
self.name = name
self.hidden_name = name
这两个不是都一样吗,哪节课是视频或者是作业,我去看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-8 10:44:46 | 显示全部楼层
大马强 发表于 2022-1-8 10:42
这两个不是都一样吗,哪节课是视频或者是作业,我去看看

https://www.bilibili.com/video/B ... _id_from=pageDriver
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:50:39 | 显示全部楼层
???你也没使用getter setter啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:56:18 | 显示全部楼层
fledgling 发表于 2022-1-8 10:44
https://www.bilibili.com/video/BV1hW41197sB?p=102&spm_id_from=pageDriver

你看视频的 7分50秒的地方,这只是掩耳盗铃,我看不出那里能藏起来
在上帝视角,你改啥名都没用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-8 10:57:19 | 显示全部楼层
hrpzcf 发表于 2022-1-8 10:50
???你也没使用getter setter啊?

用了呀,第9行和第11行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 11:00:58 | 显示全部楼层

你要看到p103的10分35秒,他讲了一个通过加 __ 来让外部无法访问的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 11:05:06 | 显示全部楼层    本楼为最佳答案   
fledgling 发表于 2022-1-8 10:57
用了呀,第9行和第11行

这两个是类的默认方法,
你那个是自己定义的,虽然实现的结果是一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 11:06:55 | 显示全部楼层
所以说,这个方法根本不能起到隐藏内部变量的作用
在他的下一个视频,他才会讲到通过加 __ 来让外部无法访问类的属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 10:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表