python cookbook第三版学习笔记十五:property和描述
8.5 私有属性:
在python中,如果想将私有数据封装到类的实例上,有两种方法:1 单下划线。2 双下划线
1 单下划线一般认为是内部实现,但是如果想从外部访问的话也是可以的
2 双下划线是则无法通过外部访问且不能被继承覆盖
来看下面的这个例子:
class B:
def __init__(self):
self.__private=0
def __private_method(self):
print("__private method")
def public_method(self):
self.__private_method()
print("public method")
class C(B):
def __init__(self):
super().__init__()
self.__private=2
def __private_method(self):
print("private_method in C")
def public_method(self):
self.__private_method()
print("public method in C")
if __name__=="__main__":
b=B()
b.public_method()
c=C()
c.public_method()
运行结果:可以看到在C中虽然也申明了__private_method。但是B类中的函数并没有被C所覆盖
__private method
public method
private_method in C
public method in C
8.6 可管理的属性:
要自定义对属性的访问,一种简单的方式就是将其定义为property
class Person():
def __init__(self,name):
self.first_name=name
@property
def name(self):
return self.first_name
@name.setter
def name(self,name):
if not isinstance(name,str):
raise TypeError('Expected a string')
self.first_name=name
@name.deleter
def name(self):
raise AttributeError('can not delete attribute')
通过对name进行property进行修饰,可以将name变成一个属性直接调用。在通过@name.setter就可以对属性进行赋值操作
if __name__=="__main__":
p=Person("abc")
print(p.name)
p.name="zhf"
print(p.name)
del p.name
运行结果:
abc
zhf
Traceback (most recent call last):
File "D:/py_prj/test2/cookbook.py", line 47, in <module>
del p.name
File "D:/py_prj/test2/cookbook.py", line 38, in name
raise AttributeError('can not delete attribute')
AttributeError: can not delete attribute
下面来看一种新式的实例属性。可以用描述符类的形式定义功能。所谓的描述符就是用特殊方法__get__(),__set__(),__del__()。这些方法通过接受类示例作为输入来工作。
class Integer:
def __init__(self,name):
self.name=name
def __get__(self, instance, owner):
if instance is None:
return self
else:
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value,int):
raise TypeError('expect int')
instance.__dict__[self.name]=value
def __delete__(self, instance):
del instance.__dict__[self.name]
class Point():
x=Integer('x')
y=Integer('y')
def __init__(self,x,y):
self.x=x
self.y=y
在这里x,y和分别是Integer的实例化对象。但是通过描述符,我们可以把描述符的实例放置在类的定义中作为类变量来使用。当这么做的时候,所有针对描述符属性的访问都会被__get__(),.__set__()和__delete__方法捕获。
比如调用self.x的时候其实调用的是Point.x__set__(p,x). 也就是说在Integer的__set__参数instance其实是Point的实例化对象。通过这种描述符的方法,我们就可以对类中的变量自动进行赋值以及类型判断。相比于使用property的方法。这种方法更加简洁
python cookbook第三版学习笔记十五:property和描述的更多相关文章
- python cookbook第三版学习笔记十:类和对象(一)
类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair: def __init__(self,x,y): self.x=x self. ...
- python cookbook第三版学习笔记十六:抽象基类
假设一个工程中有多个类,每个类都通过__init__来初始化参数.但是可能有很多高度重复且样式相同的__init__.为了减少代码.我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中 ...
- python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性
先介绍几个类中的应用__getattr__,__setattr__,__get__,__set__,__getattribute__,. __getattr__:当在类中找不到attribute的时候 ...
- python cookbook第三版学习笔记十四:类和对象(五)代理类以及内存回收
代理类: 代理类的作用其实有继承有些类似,如果你想将某个实例的属性访问代理到内部另外一个实例中去,可以用继承也可以用代理.来看下代理的应用: class A: def spam(self,x) ...
- python cookbook第三版学习笔记十九:未包装的函数添加参数
比如有下面如下的代码,每个函数都需要判断debug的是否为True,而默认的debug为False def a(x,debug=False): if debug: print('calling a') ...
- python cookbook第三版学习笔记十八:可由用户修改的装饰器
定义一个属性可由用户修改的装饰器: 在前面的介绍中使用装饰器来包装函数,这一章来介绍下如何让用户调整装饰器的属性. 首先来看下代码: from functools import wraps,parti ...
- python cookbook第三版学习笔记二十:可自定义属性的装饰器
在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...
- python cookbook第三版学习笔记六:迭代器与生成器
假如我们有一个列表 items=[1,2,3].我们要遍历这个列表我们会用下面的方式 For i in items: Print i 首先介绍几个概念:容器,可迭代对象,迭代器 容器是一种存储数据 ...
- python cookbook第三版学习笔记 一
数据结构 假设有M个元素的列表,需要从中分解出N个对象,N<M,这会导致分解的值过多的异常.如下: record=['zhf','zhf@163.com','775-555-1212','847 ...
随机推荐
- 新Android工程src和layout目录为空的问题
问题症状:eclipse创建的新Android工程,发现src下为空,res\layout目录下也为空. 原因:升级了SDK,新版本sdk与ADT冲突.具体冲突的版本号为ADT 23.X与SDK22. ...
- Mysql和SqlServer互相转换
环境: Windows XP sp2 MS SQL Server 2OOO sp1 MySql 5.0.41 1:MSSQLServer数据库导入到MySql数据库 步骤: 1.安装mysql数据库的 ...
- 使用ByteRef加速String类型DocValues的载入
眼下商户索引DocValues很大,warmup时花费70-80秒(在beta环境),有62秒在载入DocValues,发现当中有54秒时间在载入string docvalues,string doc ...
- 【Linux】使用xshell登陆时密码框为灰色,无法输入密码
使用xshell登陆时,出现以上情况,那么这到底值咋回事呢?经过查询以后发现是服务器端设置问题,解决办法如下: vi /etc/ssh/sshd_config 接着保存退出,然后重启sshd服务 se ...
- iOS项目开发之仿网易彩票推荐应用
简介 效果展示 思路分析 代码实现 Git地址 一.简介 某些公司有较多的产品时,通常会在一个产品中推广另外的一些产品,我简单的封装了一个UIControllerView,由于不同公司,要求不同.所以 ...
- Manifest.xml中删除了『存储/修改删除SD卡中的内容』和『手机通话/读取手机状态和身份』权限,但生成apk安装软件时仍提示 允许应用程序了解或使用这两个权限
原因:Android系统会给targetSdk版本为“4”以下的应用自动分配WRITE_EXTERNAL_STORAGE 和 READ_PHONE_STATE 权限. 解放办法:在manifest.x ...
- 对ListView滚动状态的监听
有的时候,我们需要对ListView滚动做一个相应的监听事件,例如:要实现如下图通讯录的功能: 思路为:首先呢,中间那个"路"字为一个TextView,它与ListView采用相对 ...
- 二维树状数组的区间加减及查询 tyvj 1716 上帝造题的七分钟
详细解释见小结.http://blog.csdn.net/zmx354/article/details/31740985 #include <algorithm> #include < ...
- POJ 3126 Prime Path (BFS+剪枝)
题目链接:传送门 题意: 给定两个四位数a.b,每次能够改变a的随意一位.而且确保改变后的a是一个素数. 问最少经过多少次改变a能够变成b. 分析: BFS,每次枚举改变的数,有一个剪枝,就是假设这个 ...
- MapReduce小文件处理之CombineFileInputFormat实现
在MapReduce使用过程中.一般会遇到输入文件特别小(几百KB.几十MB).而Hadoop默认会为每一个文件向yarn申请一个container启动map,container的启动关闭是很耗时的. ...