# -*- 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. git 技巧

    将某个文件回退到某个版本 git co d359624286d9c1f022b8b3b6f2d3fe3b6524188b build.sh 查看某个文件在某个版本时的内容 git show d3596 ...

  2. 知方可补不足~CSS中的几个伪元素

    对于一个很好的编辑器VS来说,它对于编程语句的自动提示功能是很强大的,有时,我们根本不需要看相关API,而直接看VS给我们的提示就可以完成一个新技术的学习了. 今天我们来说几个CSS中的伪元素,它们在 ...

  3. oracle日期计算

    查询某月有多少天.代码例如以下: select to_number(add_months( trunc(to_date('2014-11-4 11:13:53','yyyy-mm-dd hh24:mi ...

  4. core_cm3文件函数一览

    core_cm3是ARM公司推出来的统一规定,这是对下游芯片厂商的统一规定,因此可以再Cortex-M3(CM3)之间进行移植.此文件中定义了一些对特殊功能寄存器的C语言形式的操作,本质上是内敛汇编和 ...

  5. 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)

    Biggest Number http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30851#problem/F 解题思路:DFS(检索)+BF ...

  6. [RxJS] Refactoring Composable Streams in RxJS, switchMap()

    Refactoring streams in RxJS is mostly moving pieces of smaller streams around. This lessons demonstr ...

  7. Android控件属性大全[整理转载]

    控件属性: android属性 Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料, 第一类:属性值为true或falseandroid:layout_ ...

  8. 什么是系统平均负载(Load average)

    一.什么是系统平均负载(Load average)? 在Linux系统中,uptime.w.top等命令都会有系统平均负载load average的输出,那么什么是系统平均负载呢? Load Aver ...

  9. FineUI上传控件

    文件上传 现在就简单多了,并且也漂亮多了,参考这个示例. 1: <ext:SimpleForm ID="SimpleForm1" BodyPadding="5px& ...

  10. arc engine - ILayer.

    ILayer    ILayer接口是被图层(Layer)对象实现的,图层对象是用来在地图中显示空间信息.    注意,图层不含有空间数据,它只是获取数据的一个引用层而已.图层对象是一个抽象对象,它定 ...