python中关于类隐藏属性的三种处理方法
关于隐藏属性
引子:
当类的属性或者类实例对象的属性隐藏的时候必须通过存取器方法来获取和设置这些隐藏的属性。
例如:
def get_name(self,name): #存取器方法
self._name=name
通过外部调用实例函数传参达到获取和设置隐藏属性的目的。这样的函数叫做存取器
缺点:是必须通过调用存取器方法来实现这些功能
为此python提供了更强大的特性函数,即property函数
(1)property()函数
例如:
name=property(get_name,set_name)
property函数封装了get_name,set_name存取器方法,在类的外部可以像其他没隐藏的属性一样操作属性
实际上,property是一个类,它的实例包含了一些魔法方法,上述例子name=property()就是它的一个实例对象,这个实例对象实现了隐藏属性的反隐藏
property还可以通过修饰器的形式实现这个功能
(2)@property装饰器
实现其他语言所拥有的getter,setter和deleter的功能(例如IOS苹果开发,实现获取,设置,删除隐藏的属性)
作用:
用来模拟一个属性
(其实‘模拟’这个说法不是很准确,官方这么说就这么用了,应该说重写更合适,因为模拟前后的属性是同一个属性,用id()函数获取的地址值是相同的)
通过@property装饰器可以对模拟属性的取值和赋值加以控制
例如:
__双下划线隐藏的属性可以被控制在外部修改
@property (实现getter取值)
def score(self):
return self.__score 返回隐藏的属性
(score看似是一个实例函数,其实是一个属性,因为它已经被property装饰器装饰了)
@score.setter (实现设置值,必须写成setter,因为python就是这么规定的)
def score(self,v):
assert 0<=v<=100,‘成绩不合法’
self.__score=v
@score.deleter
def.score(self): (实现删除值)
del self.__socre
注意:
属性一旦删除,就无法设置和获取
为什么用properyt函数?
property通常用在类或者子类中对隐藏属性的改写,类的代码可能有几千行,隐藏属性在内部调用的次数可能就有几百次,如果一个个修改很麻烦,用存取器方法和property函数可以很方便的实现隐藏属性的反隐藏
另外python还有一种处理隐藏属性的方法,不过这个知识点比较晦涩难懂
(3)python的类内部有__getattr__,__setattr__,__delattr__魔法方法,能拦截所有的类属性
例如:
a.name
当在类的外部访问不到隐藏的属性时候,__getattr__会被自动调用,它搜索所的类属性,直到找到隐藏的属性
在类内__getattr__这些魔法方法是可以重写的(重写还是比较复杂的)
class A;
def __getattr__(self,name): #这里的形参name是属性名的意思,不是类属性self.name的那个name
if name=‘name’:
return self.__name
else:
raise AttributeError()
这里要写一个判断,目的是为了当找不到属性时候(类里面根本就没有这个属性,无论是否是隐藏的属性),就直接报错,避免__getattr__一直不停地搜寻下去,形成死循环
在交互模式下用help(list.__getattribute__)查看__getattr__或者__getattribute__的工作原理如下:
__getattribute__(self, name, /)
Return getattr(self, name)
它是返回python的内建函数getattr(),即不断地查询类内的所有属性
class A;
def __setattr__(self,name,value):
if name=‘name’:
self.__name=name
else:
self.__dict__[name]=value
这里设置判断,如果没有这个属性,就直接用__dict__[name]=name来给类实例增加一个属性,避免死循环
所以总结一下,用魔法方法__getattr__这类方法比用property属性方法相比更复杂点,建议处理同类问题的时候用property属性方法更好
python中关于类隐藏属性的三种处理方法的更多相关文章
- python 中增加css样式的三种方式
增加css样式的三种方式: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Python 中删除列表元素的三种方法
列表基本上是 Python 中最常用的数据结构之一了,并且删除操作也是经常使用的. 那到底有哪些方法可以删除列表中的元素呢?这篇文章就来总结一下. 一共有三种方法,分别是 remove,pop 和 d ...
- DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)
DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...
- C++中的类继承(1) 三种继承方式
继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程. ...
- python中“*”、"*args"、"kwargs"三种用法
参考链接:https://www.cnblogs.com/cwind/p/8996000.html 注意的是: (1)"*"符号的用法很类似C++中的指针,针对列表; (2)&qu ...
- python中简单文件的输入三种方式
最近在自学python,简单的总结了一下文件的输入的方式. 1. f=open("foo.txt") line=f.readline() while line: print(lin ...
- python中自定义类对象json字符串化的方法
1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...
- Class类对象的三种实例化方法
class X { } public class GetClassDemo01 { public static void main(String[] args) { X x = ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
随机推荐
- Apache重写规则
1..htaccess文件使用前提 .htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体 地怎样接待它,就是此文件 ...
- iOSAPP开发项目搭建
架构图: 架构原则:易读性.易维护性.易扩展性. 一.思考 做好一件事,花在思考上的时间应该多于执行. 首先根据产品需求和设计图,脑中先建立一个产品架构: 1. 产品的定位是什么. 社交?媒体?游戏? ...
- Django2.1发布,Django2.1新特性
Django 2.1 现已正式发布,官方表示随着 2.1 的发布,对 2.0 系列的主流支持服务将结束,进入安全修复服务周期,直至2019年4月. 2.1新特性:https://docs.django ...
- springboot + mybatis
这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于spring boot ...
- [每天解决一问题系列 - 0006] MSBuild 和Visual Studio并行编译
问题描述: 有的项目会有上百个.net工程,编译时间会很长,如何缩短编译的时间呢? 解决方法: 如果使用MSbuild, 指定/maxcpucount 或者/m,如果不指定值,则取当前机器逻辑CPU的 ...
- Centos 7 安装 rabbitmq
1.安装erlang rabbitmq 官方下载地址 "http://www.rabbitmq.com/download.html" ,选择"RHEL, CentOS, ...
- 树莓派安装vnc server并设置自启动
在SSH终端输入sudo raspi-config, 这里需要打开几个选项: expand_rootfs – 将根分区扩展到整张SD卡; change_pass – 默认的用户名是pi,密码是rasp ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十四):项目打包部署
项目打包部署 安装MySQL镜像 注意:如果使用docker镜像安装MySQL,也需要在前端部署主机安装MySQL,因为备份还原功能是使用MySQL的本地命令进行操作的. 下载镜像 执行以下命令,拉取 ...
- 关于const用法的学习
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whenever you need”.1.const作函数参数 例如 ...
- GC频繁抖动的主要原因
内存抖动 内存抖动是因为大量的对象被创建又在短时间内马上被释放,如循环中分配对象,很容易引起GC,特别是在较大的循环次数或者一个循环中分配较多的临时对象时. 瞬间产生大量的对象 瞬间产生大量的对象,即 ...