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和描述的更多相关文章

  1. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  2. python cookbook第三版学习笔记十六:抽象基类

    假设一个工程中有多个类,每个类都通过__init__来初始化参数.但是可能有很多高度重复且样式相同的__init__.为了减少代码.我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中 ...

  3. python cookbook第三版学习笔记十二:类和对象(三)创建新的类或实例属性

    先介绍几个类中的应用__getattr__,__setattr__,__get__,__set__,__getattribute__,. __getattr__:当在类中找不到attribute的时候 ...

  4. python cookbook第三版学习笔记十四:类和对象(五)代理类以及内存回收

    代理类: 代理类的作用其实有继承有些类似,如果你想将某个实例的属性访问代理到内部另外一个实例中去,可以用继承也可以用代理.来看下代理的应用: class A:     def spam(self,x) ...

  5. python cookbook第三版学习笔记十九:未包装的函数添加参数

    比如有下面如下的代码,每个函数都需要判断debug的是否为True,而默认的debug为False def a(x,debug=False): if debug: print('calling a') ...

  6. python cookbook第三版学习笔记十八:可由用户修改的装饰器

    定义一个属性可由用户修改的装饰器: 在前面的介绍中使用装饰器来包装函数,这一章来介绍下如何让用户调整装饰器的属性. 首先来看下代码: from functools import wraps,parti ...

  7. python cookbook第三版学习笔记二十:可自定义属性的装饰器

    在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...

  8. python cookbook第三版学习笔记六:迭代器与生成器

    假如我们有一个列表 items=[1,2,3].我们要遍历这个列表我们会用下面的方式 For i in items:   Print i 首先介绍几个概念:容器,可迭代对象,迭代器 容器是一种存储数据 ...

  9. python cookbook第三版学习笔记 一

    数据结构 假设有M个元素的列表,需要从中分解出N个对象,N<M,这会导致分解的值过多的异常.如下: record=['zhf','zhf@163.com','775-555-1212','847 ...

随机推荐

  1. Tomcat 高性能实现关键点

    我在这里给大家讲解下Tomcat架构设计的几个关键要素,重点从性能及高可用等几个方面来讲解: 1.技术选型 (1) BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限 ...

  2. MySQL5.7 基于二进制包的安装

    1.MySQL5.7安装注意事项 1.在MySQL5.7中mysql_install_db已经不再推荐使用,建议改成mysqld-initialize 完成实力初始化.(mysql_install_d ...

  3. crm使用soap取消用户訪问记录权限

    //取消訪问权限 function demo() {     //操作记录的id     var targetId = "A8A46444-BA10-E411-8A04-00155D002F ...

  4. discuz !NT 3.5 论坛整合 .net 网站用户登录,退出

    using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlCont ...

  5. The Application does not have a valid signature

    真机运行程序,报错(The application does not have a valid signature,如图 环境:Xcode7.3,使用cocoapods管理第三方库 如果确认证书没有问 ...

  6. ie8下面版本号(包含ie8)的浏览器不支持html5标签属性解决方式(Modernizr 2.6.2插件的使用)

    我这边申明下:我写这篇日志主要是想然ie8可以支持html5的个别标签闭合,并不能让ie全然支持html5.我之前写的可能会误导非常多同学.希望大家能明确. 今天脑抽想用html5标签设计一个网页.我 ...

  7. lower_bound() 与 upper_bound()

    1. lower_bound() lower_bound()是泛型算法,在使用时,需要先将序列进行排序: 作用:  函数lower_bound()在first和last中的前闭后开区间进行二分查找,返 ...

  8. SpringBoot使用MyBatis报错:Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseInsertProvider.dynamicSQL)

    © 版权声明:本文为博主原创文章,转载请注明出处  1. 错误描述 使用SpringBoot集成MyBatis框架,并且使用 mapper-spring-boot-starter 自动生成MyBati ...

  9. Unity3d 发动机原理详细介绍

    Unity3d 发动机原理详细介绍 www.MyException.Cn   发布于:2013-10-08 16:32:36   浏览:46次 0     Unity3d 引擎原理详细介绍 体系结构 ...

  10. hbase和mapreduce开发 WordCount

    代码: /** * hello world by world 测试数据 * @author a * */ public class DefinedMapper extends Mapper<Lo ...