圆月山庄资源网 Design By www.vgjia.com
类的私有属性和方法
Python是个开放的语言,默认情况下所有的属性和方法都是公开的 或者叫公有方法,不像C++和 Java中有明确的public
,private
关键字来区分私有公有。
Python默认的成员函数和成员变量都是公开的,类的私有属性指只有在类的内部使用的属性或方法,表现形式为以“__“ 属性名或方法名以双下划线开头。
class Test(object): __count = 0 # 私有属性 __count def get_count(self): return self.__count # 类的内部可以使用私有属性 def set_count(self, value): if self.__check_value(value): # 在类的内部调用类的私有方法 self.__class__.__count = value def __check_value(self, value): # 定义类的私有方法 检查参数 if isinstance(value, int): return True a = Test() print(a.get_count()) a.set_count(100) print(a.get_count()) #a.__check_value(10) # 调用私有方法会报错 #print(a.__count) # 直接访问私有属性也会报错
应用场景
对于一些敏感的数据,我们不希望直接被的函数调用,或者不希望草率的直接 object.key = value
来修改,我们可以选择将属性声名为私有的,这样从外部时无法访问该属性的,也就不能修改了,但是依然可以修改属性字典的方法来修改。
# 当然 可以使用 @proprety class Person(object): __name = 'Monkey' def update_name(self, name): self.__name = name def get_name(self): return self.__name p = Person() p.update_name('BlackMonkey') print(p.get_name()) # BlackMonkey print(p.__name) # 报错 AttributeError: 'Person' object has no attribute '__name'
下面在看下python中私有属性和受保护的属性的实例代码
具体代码如下所示:
class People: def __init__(self, name, age): self.name = name self.age = age self._protect_var = 10 # 受保护的成员,使用一个下划线_,它仅仅是提示成员受保护,但可以被更改 self.__private_var = 10 # 使用双下划线__可以定义私有属性 def sayhi(self): print("Hi, my name is {}, and I'm {}".format(self.name, self.age)) def get_var(self): print(self.__private_var) def set_var(self, var): self.__private_var = var # class instance 类的实例化 someone = People(name='Jack', age=20) # 类的实例化 print(someone._protect_var) # 10 受保护的成员可以被打印 someone._protect_var = 20 # 受保护的成员可以被修改 print(someone._protect_var) # 20 可以被修改 # print(someone.__private_var) # 报错 AttributeError: 'People' object has no attribute '__private_var' someone.__private_var = 30 # 此处可以被修改,不会报错(此处表示私有属性可以被修改,具体原因可以百度) print(someone.__private_var) # 可以打印,不会报错 someone.get_var() # 10 此处可以发现,__private_var在上面被改成30,但此处打印出来却是10(具体原因可以百度) someone.set_var(40) someone.get_var() # 40 这里通过someone.set_var(40)改成了40 print(dir(someone)) # dir()打印出someone这个对象支持的属性和方法 # ['_People__private_var', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__private_var', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_protect_var', 'age', 'get_var', 'name', 'sayhi', 'set_var'] # 在类的内部重命名了 __private_var重命名成_People__private_var someone._People__private_var = 100 someone.get_var() # 100 通过_People__private_var把__private_var的值改成了100
总结
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月02日
2024年11月02日
- 魔兽世界奥卡兹岛地牢入口在哪里 奥卡兹岛地牢入口位置一览
- 和文军-丽江礼物[2007]FLAC
- 陈随意2012-今生的伴[豪记][WAV+CUE]
- 罗百吉.2018-我们都一样【乾坤唱片】【WAV+CUE】
- 《怪物猎人:荒野》不加中配请愿书引热议:跪久站不起来了?
- 《龙腾世纪4》IGN 9分!殿堂级RPG作品
- Twitch新规禁止皮套外露敏感部位 主播直接“真身”出镜
- 木吉他.1994-木吉他作品全集【滚石】【WAV+CUE】
- 莫华伦.2022-一起走过的日子【京文】【WAV+CUE】
- 曾淑勤.1989-装在袋子里的回忆【点将】【WAV+CUE】
- 滚石香港黄金十年系列《赵传精选》首版[WAV+CUE][1.1G]
- 雷婷《乡村情歌·清新民谣》1:1母盘直刻[低速原抓WAV+CUE][1.1G]
- 群星 《DJ夜色魅影HQⅡ》天艺唱片[WAV+CUE][1.1G]
- 群星《烧透你的耳朵2》DXD金佰利 [低速原抓WAV+CUE][1.3G]
- 群星《难忘的回忆精选4》宝丽金2CD[WAV+CUE][1.4G]