fledgling 发表于 2022-1-8 10:03:14

python中关于类的封装

类的封装中,有教学视频中说,改变某个对象对应的属性名就可以隐藏对象的属性,在通过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 10:20:00

你这不是修改属性值吗?
我话是有点没看懂

fledgling 发表于 2022-1-8 10:28:00

大马强 发表于 2022-1-8 10:20
你这不是修改属性值吗?
我话是有点没看懂

教学视频中说,改变一个属性名就可以避免属性值被修改。但是,我修改了属性名后,属性值仍然很容易就被修改了,完全没必要有什么getter方法和setter方法

大马强 发表于 2022-1-8 10:34:31

你这属性名不是一直都是 self.hidden_name 吗?我去看下资料

fledgling 发表于 2022-1-8 10:37:56

大马强 发表于 2022-1-8 10:34
你这属性名不是一直都是 self.hidden_name 吗?我去看下资料

普通的,没有修改的名字是self.name = name,视频中说,变为self.hidden_name = name,就可以避免属性值被直接修改

kogawananari 发表于 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)

大马强 发表于 2022-1-8 10:42:38

self.name = name
self.hidden_name = name
这两个不是都一样吗,哪节课是视频或者是作业,我去看看

fledgling 发表于 2022-1-8 10:44:46

大马强 发表于 2022-1-8 10:42
这两个不是都一样吗,哪节课是视频或者是作业,我去看看

https://www.bilibili.com/video/BV1hW41197sB?p=102&spm_id_from=pageDriver

hrpzcf 发表于 2022-1-8 10:50:39

???你也没使用getter setter啊?

大马强 发表于 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秒的地方,这只是掩耳盗铃,我看不出那里能藏起来
在上帝视角,你改啥名都没用

fledgling 发表于 2022-1-8 10:57:19

hrpzcf 发表于 2022-1-8 10:50
???你也没使用getter setter啊?

用了呀,第9行和第11行

大马强 发表于 2022-1-8 11:00:58


你要看到p103的10分35秒,他讲了一个通过加 __ 来让外部无法访问的方法

大马强 发表于 2022-1-8 11:05:06

fledgling 发表于 2022-1-8 10:57
用了呀,第9行和第11行

这两个是类的默认方法,
你那个是自己定义的,虽然实现的结果是一样

大马强 发表于 2022-1-8 11:06:55

所以说,这个方法根本不能起到隐藏内部变量的作用{:10_245:}
在他的下一个视频,他才会讲到通过加 __ 来让外部无法访问类的属性
页: [1]
查看完整版本: python中关于类的封装