浅谈python对象数据的读写权限

面向对象的编程语言在写大型程序的的时候,往往比面向过程的语言用起来更方便,安全。其中原因之一在于:类机制。

类,对众多的数据进行分类,封装,让一个数据对象成为一个完整的个体,贴近现实生活,高度抽象化。但是,python对类的封装并不好,因为所有的属性和方法都是公开的,你可以随意访问或者写入,你可以在类的外部对类的属性进行修改,甚至添加属性。这的确让人感到不安。

下面就来总结一下学习后的解决方案。

1,使用2个下划线前缀隐藏属性或者方法。

__xxx
#!/usr/bin/python3
#-*- coding:utf-8 -*-
class student:
def __init__(self,name,score):
self.name = name
self.__score = score #将score隐藏起来,使之仅在类内部可用。
def __show(self): #一个隐藏的方法,同样只在内部可用
print(self.name,self.__score)#使用被隐藏的属性__score
def show(self):
self.__show() #注意被隐藏方法的调用方式。
def main():
he = student(‘bob’,95)
he.show() #显示:bob 95
#print(he.__score) #attributeerror: ‘student’ object has no attribute ‘__score’
#he.__show() #attributeerror: ‘student’ object has no attribute ‘__show’
#隐藏属性真的被隐藏了吗?其实仍然可使用,使用格式 obj._classname__attributename
#但是仅仅作为了解,不建议使用隐藏属性。
print(he._student__show()) #显示:bob 95
print(he._student__score) # 显示: 95
if __name__==”__main__”:
main()

双下划线对类属性的影响:

1. 使属性只用于本类的内部,外部以及子类都不可直接读取修改。

2. 使用 _ _ 的类的属性,在实现时会被更改名称,如类中的__age 最后会变为_a__age (名称重整),这个好处是:通常用于涉及到继承的父类中使用。这样避免被子类属性覆盖。

2.创建可管理的属性。

有时候我们需要对属性的写入做额外的检查,对不合法的值拒绝写入,引发异常。

#!/usr/bin/python3
#-*- coding:utf-8 -*-
class student:
def __init__(self,name,score):
self.name = name
self.score = score
@property #实现属性的读取方法,读取实例的score值时,就会调用这个函数
def score(self):
return self.__score
@score.setter #实现属性写入方法,写入实例的score属性时,调用这个函数
def score(self,newval):
if not isinstance(newval,(int,float)):
raise typeerror(‘score value must be a number’)
if newval>100 or newval

Posted in 未分类

发表评论