# -*- coding: utf-8 -*-

# python:2.x

__author__ = 'Administrator'

#最佳实践

"""

为了避免前面所有的问题,必须考虑到几下几点:

~1:应该避免多重继承,可以一些设计模式来代替它

~2:super使用必须一致,在类层次结构中,应该在所有地方都使用super或者彻底不使用它,滥用super和传统调用是一种滥用方法,建议使用super

~3:不要滥用经典类和新式类,两者都具备代码库将导致不同的mro表现

~4:调用父类时必须检查类层次,为了避免出现任何问题,每次调用父类时,必须快速地查看一下所涉及的MRO(__mro__)

"""

#描述符与属性

"""

当很多C++和JAVA的朋友第一次学python时,会对python里面没有private关键字感到惊讶,最接近的概念是"name mangling"(名称改编),每次一个特性前面加上<"_">前缀时,

它就被解释程序立刻重新命名,例如:

"""

class M(object):

__secret_value=1

m_of=M()

#m_of.__secret_value AttributeError: 'M' object has no attribute '__secret_value'

print dir(M)

print m_of._M__secret_value#1

'''

python提供它主要是用来避免继承带来命名冲突,特性被重命名为带有类名前缀的名称,这实际上并不是强制的,因为可以通过其他组合名称来访问特性,主 个功能可能被用来保护一些特性的访问,

但在实践中,从来不使用"__",当一个特性不是公开时,惯例是使用一个"_"前缀,这不会调用任何改编算法,只是证明这个特性是该类的私有元素,也就是流行的样式

python中还有其他可用的机制来构建类的公共部分和私有代码,描述符和属性这些oop设计的关键特性应该被用于设计清晰的API。

'''

##描述符

#作用:用来自定义在引用一个对象上的特性时所应该完成的事情

"""

描述符是python中复杂特性访问基础,<只能在内部使用>,以实现属性,类,静态方法和super类等,是定义另一个类特性可能访问方式的类,也就是说,一个类可以委托

另一个类来管理其特性

甚于个必须实现的特殊方法:

~1:__set__:在任何特性被设置的时候调用,在后面的实例中,叫setter

~2:__get__:在任何特性被赢取时调用,也叫getter

~#:__delete__:特性上请求del时调用

这些方法是在__dict))特性之前被调用

例如 :

"""

#查找定义

# if hasattr(M,'attribute'):

#     attribute=M.attribute

#     AttributeClass=attribute.__class__

#     #属性定义是否有settter

#     AttributeClass.__set__(attribute,isinstance,value)

#     return

# #常规方法

# isinstance.__dict__['attribute']=value #or 'attribute'is not found in __dict__

# sritable=(hasattr(AttributeClass,'__set__')) or 'attribute'not in isinstance.__dict__

# if readable and sritable:

# #调用描述符

# return AttributeClass.__get__(attribute,isinstance,M)

# #用__dict__正常访问

# return isinstance.__dict__['attribute'] 这部分只是个模板而已

#换句话说,在类特性被定义并且有一个getter和一个setter方法时,平常鉙一个对象的实例所有元素的__dict__映射都将被劫持

"""

注意:

实现了_get_和_set_的描述符被称为数据描述符

只实现了_get_的描述符被称为非数据描述符

"""

#例子

class UpperString(object):

def __init__(self):

self._value='aa'

def __get__(self, instance, owner):

return self._value

def __setitem__(self, key, value):

self._value=value.upper()

class MyClass(object):

attribute=UpperString()

instance_of=MyClass()

print instance_of.attribute#aa

instance_of.attribute='my value'

print instance_of.attribute#my value

instance_of.__dict__={}

#如果在实例中添加一个新特性,将被保存在__dict__映射时,如下

instance_of.new_att=1

print instance_of.__dict__#{'new_att': 1}

#当一个新的数据描述符添加到类中,优先于实例的__dict__,如下

MyClass.new_att=UpperString()

print instance_of.__dict__#{'new_att': 1}

print instance_of.new_att#1

#对于非数据描述符是无效的,在那样的情况下,下面的实例优先于描述符

class W(object):

def __get__(self, instance, owner):

return 'w'

MyClass.w=W()

print  instance_of.__dict__#{'new_att': 1}

print instance_of.w#w

instance_of.w=1

print instance_of.__dict__#{'new_att': 1, 'w': 1}

#建立这样被重名的规则以避免递归特性查找

#用于将一个特性设置为一个值的算法(与用于删除特性相似),如下

#查找定义

# if hasattr(M,'attribute'):

#     attribute=M.attribute

#     AttributeClass=attribute.__class__

#     #属性定义是否有settter

#     AttributeClass.__set__(attribute,isinstance,value)

#     return

# #常规方法

# isinstance.__dict__['attribute']=value

"""

raymond hetinger写了一个名为how-to guide for descriptor文档,在http://users.rcn.com/python/download/Descriptor.html中可以找到,对上面的内容进行补充

"""

"""

除了隐藏类内容这个主要角色之外,描述符还可以实现一些有趣代码形式

1:内省描述符(introspection descriptor)将检查宿主类的签名,以计算一些信息

2:元描述符(meta descriptor)使用类方法本来来完成值计算

"""

#内省描述符

"""

使用类时,有一个公共需要,就是对其特性进行一次自我测量,例如epydoc(epdoc.sourceforge.net)也做出相信的文档

计算这种文档属性类,可以通过检查公共方法来呈现一个易于理解的文档,内建函数dir是这样一个非数据描述符的例子

"""

class Api(object):

def _print_valuer(self,o):

def __print_value(key):

if key.startswith('_'):

return ''

value=getattr(o,key)

if not hasattr(value,'im_func'):

doc=type(value).__name__

else:

if value.__doc__ is None:

doc='no docstring'

else:

doc=value.__doc__

return '%s:%s'%(key,doc)

res=[__print_value(e)for e in dir(o)]

return '\n'.join([e for e in res if e !=''])

def __get__(self, instance, owner):

if instance is not None:

return self._print_valuer(instance)

else:

return self._print_valuer(owner)

class Myclass(object):

__doc__=Api()

def __init__(self):

self.a=2

def meth(self):

'''my method'''

return  12

MyClass.__doc__

i=MyClass()

i.__doc__

#这个描述符将过滤以下划线开始元素,并且显示方法的docstrings

python高级编程之最佳实践,描述符与属性01的更多相关文章

  1. python高级编程之描述符与属性02

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元描述符 #特点是:使用宿主类的一个或者多个方法来执行一个任务,可 ...

  2. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  3. Python高级编程和异步IO并发编程

    第1章 课程简介介绍如何配置系统的开发环境以及如何加入github私人仓库获取最新源码. 1-1 导学 试看 1-2 开发环境配置 1-3 资源获取方式第2章 python中一切皆对象本章节首先对比静 ...

  4. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  5. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  6. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  7. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  8. python基础----再看property、描述符(__get__,__set__,__delete__)

    一.再看property                                                                          一个静态属性property ...

  9. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

随机推荐

  1. pyqt之倒计时例子

    from PyQt4.Qt import *from PyQt4.QtCore import *from PyQt4.QtGui import *import sysdef main():    a= ...

  2. SecureCRT 安装及初始化配置

    安装 SecureCRT 7.3.4 安装以及破解方法 SecureCRT 6.5.0 汉化解压版 初始化配置 这里配置以SecureCRT 6.5.0 汉化解压版为例 1.调整SecureCRT终端 ...

  3. Java中普通代码块,构造代码块,静态代码块的代码演示样例及区分

    //运行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 当中静态代码块仅仅运行一次.构造代码块在每次创建对象是都会运行. 1 普通代码块 <span ...

  4. ZOJ 3430 Detect the Virus 【AC自动机+解码】

    解码的那些事儿,不多说. 注意解码后的结果各种情况都有,用整数数组存储,char数组会超char类型的范围(这个事最蛋疼的啊)建立自动机的时候不能用0来判断结束. #include <cstdi ...

  5. 寒哥细谈之AutoLayout全解

    文/南栀倾寒(简书作者)原文链接:http://www.jianshu.com/p/683fbcbfb705著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 看到群中好多朋友还停留在Fr ...

  6. js_day14

  7. .NET基础拾遗(3)字符串、集合和流1

    一.字符串处理 1.1 StringBuilder类型 众所周知,在.NET中String是引用类型,具有不可变性,当一个String对象被修改.插入.连接.截断时,新的String对象就将被分配,这 ...

  8. SQL Server 2005中的分区表(三):将普通表转换成分区表

    在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底, ...

  9. linux syslog详解

    linux syslog详解 分三部分 一.syslog协议介绍 二.syslog函数 三.linux syslog配置   一.syslog协议介绍 1.介绍 在Unix类操作系统上,syslog广 ...

  10. 2、 Spark Streaming方式从socket中获取数据进行简单单词统计

    Spark 1.5.2 Spark Streaming 学习笔记和编程练习 Overview 概述 Spark Streaming is an extension of the core Spark ...