广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈python对象数据的读写权限
  • 576
分享到

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

浅谈权限对象 2022-06-04 18:06:05 576人浏览 薄情痞子

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<0:
      raise ValueError('score value must between 0 and 100')

    self.__score = newVal

  

  
def main():
  he = Student('Bob',95)
  he.score = 100   #重新写入 

  
  print(he.score)  #读取   
    
  

if __name__=="__main__":
  main()

我们可以发现: self.__score是 属性值 的真正存储的地方,而self.score是函数(只不过它用起来像一个属性),它是获取和写入属性值的方法。

初始化的时候也会调用socre.setter 装饰的函数,因为__init__()函数下出现了self.score的调用

既然self.__score仅仅用来引用属性的值,可不可以用别的命名呢?如saveScore....当然是可以的,但是,它“暴露”了,我们不想让它在外部可用,还是应该

加 __ 将它隐藏,防止意外修改。

有时候,你确定某个类不会涉及到继承,那么,就可以将上述的双下划线改写为单下滑线,虽然不会达到隐藏的作用,但是:一方面,这样不会引发名称重整机制,

避免小题大做,另一面,用一个下划线开头,可以提醒使用者,这个属性不应该直接使用。那么,这就靠自觉了。

一个实例对象可以在外部随意添加属性。


#!/usr/bin/python3
#-*- coding:utf-8 -*-


class Student:
  def __init__(self,name,score):
    self.name = name
    self.score = score 

 

  
def main():
  he = Student('Bob',95)
  he.age = 19
  print(he.age)
  

if __name__=="__main__":
  main()

使用__slots__



#!/usr/bin/python3
#-*- coding:utf-8 -*-


class Student:
  __slots__ = ('name','score') #将属性名以字符串形式加入元组
  def __init__(self,name,score):
    self.name = name
    self.score = score 

 

  
def main():
  he = Student('Bob',95)
  he.age = 19  #AttributeError: 'Student' object has no attribute 'age'
  print(he.age)
  

if __name__=="__main__":
  main()

这样,对象的属性就限定在类的内部了。

但是__slots__不能被继承。而且,__slots__的设计本意并不是上面的用法,而是创建大量(万计)对象时对内存占用进行优化

总结:

写着写着,我发觉上面的技巧意义不大。类的设计是程序员本人,使用者也是本人,那么,对象属性的

读和写就应该自己把握,类设计时本身不需要太多的保护代码,否则会很臃肿,而且效率降低。保护措施应该发生在类的外部,让类对象接受到的数据永远是合法的,这样会更加轻巧灵活。这是我的感受。

以上这篇浅谈python对象数据的读写权限就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 浅谈python对象数据的读写权限

本文链接: https://www.lsjlt.com/news/14269.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈python对象数据的读写权限
    面向对象的编程语言在写大型程序的的时候,往往比面向过程的语言用起来更方便,安全。其中原因之一在于:类机制。 类,对众多的数据进行分类,封装,让一个数据对象成为一个完整的个体,贴近现实生活,高度抽象化。但是,...
    99+
    2022-06-04
    浅谈 权限 对象
  • 浅谈Oracle数据库的对象
    Oracle数据库---对象中最基本的是表和视图,其他还有约束、索引、序列、函数、存储过程、甚至创建同义词。对数据库的操作可以基本归结为对数据对象的操作,因此,在上篇博文讲述了基本操作的基础上,本篇博文将介...
    99+
    2022-10-18
  • MySQL数据库如何设置某个表的读写权限
    小编给大家分享一下MySQL数据库如何设置某个表的读写权限,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql表设置读写的方...
    99+
    2022-10-18
  • Java操作IO对象流进行数据的读写
    对象的读写 使用ObjectInputStream和ObjectOutputStream读写对象(序列化与反序列化)。 只有字节流没有字符流 .类必须实现Serializa...
    99+
    2022-11-12
  • 如何使用Python读取大数据中的对象文件?
    在当今的数据时代,大数据已经成为了一种趋势。大数据存储的文件类型也越来越多,其中对象文件是一种常见的文件类型。Python作为一种流行的编程语言,自然也可以用来读取大数据中的对象文件。 本文将介绍如何使用Python读取大数据中的对象文件。...
    99+
    2023-10-26
    对象 文件 大数据
  • 如何进行Python数据编组对文字串的读写
    如何进行Python数据编组对文字串的读写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用前一节中介绍的模块,可以实现在文件中对字符串的读写。然而,有的时候,...
    99+
    2023-06-17
  • 拒绝了对对象 'sp_OACreate' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限
    拒绝了对对象 'sp_OACreate' (数据库 'mssqlsystemresource',架构 'sys')的 EXECUTE 权限。的解决方案.登录sa帐号找到对应登录名,打开属性,在选择页中选中用...
    99+
    2022-10-18
  • Python中的数据类型:numpy对象的优势和限制是什么?
    Python是一种高级编程语言,它可以处理各种不同的数据类型。其中,numpy是一种非常强大的数据类型,它提供了一系列的数组和矩阵计算工具,可以帮助我们处理大量数据。在本文中,我们将探讨numpy对象的优势和限制。 一、numpy对象的优...
    99+
    2023-07-20
    数据类型 numy 对象
  • 你有没有掌握Python读取大数据文件中对象的方法?
    Python作为一种强大的编程语言,拥有许多功能丰富的模块和库,可用于处理各种类型的数据。在大数据领域,Python也是一种常用的工具,因为它可以轻松地读取和处理大数据文件。但是,当处理大数据文件时,读取对象是一个常见的挑战。在这篇文章中,...
    99+
    2023-10-26
    对象 文件 大数据
  • Python中如何实现一个线程安全的并发缓存对象,保证读写一致性和数据安全性
    Python中如何实现一个线程安全的并发缓存对象,保证读写一致性和数据安全性在多线程的环境下,对共享数据进行读写操作需要考虑到线程安全的问题。当多个线程同时对一个缓存对象进行读写操作时,可能会导致数据不一致或者数据丢失的问题。为了解决这个问...
    99+
    2023-10-22
  • Python缓存技术是否可以有效地应对大数据存储中的读写问题?
    在大数据存储和处理的应用场景中,数据读写是非常频繁的操作。这些操作需要耗费大量的时间和计算资源,因此缓存技术成为了解决大数据读写问题的一个重要手段。Python作为一门流行的编程语言,也提供了多种缓存技术来优化数据读写性能。本文将介绍Py...
    99+
    2023-10-21
    缓存 大数据 存储
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作