鱼C论坛

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

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

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

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

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

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

这两个是类的默认方法,
你那个是自己定义的,虽然实现的结果是一样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-1-8 10:20:00 | 显示全部楼层
你这不是修改属性值吗?
我话是有点没看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

教学视频中说,改变一个属性名就可以避免属性值被修改。但是,我修改了属性名后,属性值仍然很容易就被修改了,完全没必要有什么getter方法和setter方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:34:31 | 显示全部楼层
你这属性名不是一直都是 self.hidden_name 吗?我去看下资料
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

普通的,没有修改的名字是self.name = name,视频中说,变为self.hidden_name = name,就可以避免属性值被直接修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  7. dog = Dog('🐟')
  8. print(dog.get_food)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:42:38 | 显示全部楼层
  1. self.name = name
  2. self.hidden_name = name
复制代码

这两个不是都一样吗,哪节课是视频或者是作业,我去看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

https://www.bilibili.com/video/B ... _id_from=pageDriver
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-8 10:50:39 | 显示全部楼层
???你也没使用getter setter啊?
小甲鱼最新课程 -> https://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秒的地方,这只是掩耳盗铃,我看不出那里能藏起来
在上帝视角,你改啥名都没用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

用了呀,第9行和第11行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你要看到p103的10分35秒,他讲了一个通过加 __ 来让外部无法访问的方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这两个是类的默认方法,
你那个是自己定义的,虽然实现的结果是一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 22:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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