python高级编程之最佳实践,描述符与属性01
# -*- 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的更多相关文章
- python高级编程之描述符与属性02
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元描述符 #特点是:使用宿主类的一个或者多个方法来执行一个任务,可 ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- Python高级编程和异步IO并发编程
第1章 课程简介介绍如何配置系统的开发环境以及如何加入github私人仓库获取最新源码. 1-1 导学 试看 1-2 开发环境配置 1-3 资源获取方式第2章 python中一切皆对象本章节首先对比静 ...
- 第十一章:Python高级编程-协程和异步IO
第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python基础----再看property、描述符(__get__,__set__,__delete__)
一.再看property 一个静态属性property ...
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
随机推荐
- jQuery 之$.proxy() 方法
定义和用法 $.proxy 方法接受一个已有的函数,并返回一个带特定上下文的新的函数. 该方法通常用于向上下文指向不同对象的元素添加事件. 参数 描述 function 要被调用的已有的函数. con ...
- Could not load the Tomcat server configuration at /Servers/Tomcat v7.0 Server at localhost-config.
[问题] Eclipse[Ubuntu14.04]中启动Tomcat Server[7.0.55]的时候出现错误例如以下: [解决方法] 1.将下边的Servers中的server[Tomcat v7 ...
- 【hoj】1604 cable master
简单,二分法,可是在oj上交的时候会有精度的限制,所以仅仅能把数扩得大一点,并且在扩的时候为防止尾数会自己主动生成一些非零数,所以还是自己吧扩到的位置设置为0,还有输出时由于%.2lf会自己有4设5入 ...
- Git diff (---和+++具体解释)
如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间.1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示 ...
- 操作系统下查看HBA卡信息wwn的方法
一.Windows 系统在Windows系统中,可以使用FC HBA卡厂家提供的管理软件查看光纤适配器的WWN号码,具体如下:Qlogic:SANsurferEmulex:HBAnyware http ...
- verilog 实现加法器
半加器 如果不考虑来自低位的进位将两个1二进制数相加,称为半加. 实现半加运算的逻辑电路称为半加器. 真值表 逻辑表达式和 \begin{align}\notag s = a{b}' + {a}'b ...
- Linux基础知识(二)
1. 请回答,32位和64位有什么区别呢?什么时候安装32位的,又什么时候安装64位操作系统呢?如何查看系统是32位的还是64位的? 所谓的32位.64位指的是CPU的GPRs(General-Pur ...
- (转)sql中 in 、not in 、exists、not exists 用法和差别
exists (sql 返回结果集为真) not exists (sql 不返回结果集为真) 如下: 表A ID NAME 1 A1 2 A2 3 A3 表B ID AI ...
- C#上传图片同时生成缩略图,控制图片上传大小。
#region 上传图片生成缩略图 /// <summary> /// 上传图片 /// </summary> /// <param name="sender& ...
- arc engine - ILayer.
ILayer ILayer接口是被图层(Layer)对象实现的,图层对象是用来在地图中显示空间信息. 注意,图层不含有空间数据,它只是获取数据的一个引用层而已.图层对象是一个抽象对象,它定 ...