python高级编程之描述符与属性03

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

# python:2.x

__author__ = ‘Administrator‘

#属性Property

#提供了一个内建描述符类型,它知道如何将一个特性链接到一组方法上,采用fget参数和3个可选的参数-fset,fdel,doc最后一个参数可以提供用来定义一个后链接到特性的docstring,就像个方法,如下

class MyClass(object):

def __init__(self):

self._my_seceret_ting=1

def _i_get(self):

return self._my_seceret_ting

def _i_set_(self,a):

self._my_seceret_ting=a

def _i_delte(self):

print ‘del‘

my_ting=property(_i_get,_i_set_,_i_delte,‘the ting‘)

instance_of=MyClass()

print instance_of.my_ting#1

instance_of.my_ting=3

print instance_of.my_ting#3

del instance_of.my_ting#del

help(instance_of)

"""

属性简化了描述符编写,但是在使用类继承时必须小心处理,所创建的特性使用当前类方法创建,而不是使用在派生类中重载方法

如下:

"""

class A(object):

def __get1(self):

return ‘&aa‘

price=property(__get1)

class S(A):

def _get_price(self):

return ‘bb‘

p=S()

print p.price#&aa

#解决方法是使用另一种方法手工将属性实例重定向到正确的方法,如下

class B(object):

def _g(self):

return ‘&qqw‘

def _g1(self):

return self._g()

pr1=property(_g1)

class BB(B):

def _get_price(self):

return‘&bb‘

cc=BB()

print cc.pr1#&qqw

#尽管如此,大部分时候属性都添加到类中,以隐藏其性,链接到它们的方法是私有的,所有重载它们是不好的做法,在这样的情况下,重载属性本身会更好一些,如下

class B(object):

def _g(self):

return ‘&q1qw‘

p1=property(_g)

class BB(B):

def _a(self):

return‘&bb1‘

aa=BB()

print aa.p1#&q1qw

print ‘&‘*300

#槽:__slots__特性为指定类设置一个静态特性列表,并且路过每个类实例中的__dict__列表创建工作,用来为特性很少的类节省存储空间,因为将不在每个实例中创建__dict__

#另一方便px还可以有助于设计签名被交结的类,例如

class Fr(object):

__slots__=[‘ice‘,‘apply‘]

print ‘__dict__‘ in dir(Fr)#False

print ‘ice‘in dir(Fr)#True

g=Fr()

g.ice=1

g.apply=1

g.ic1e=1#AttributeError: ‘Fr‘ object has no attribute ‘ic1e‘

#注意:任何新的特性都将在__dict))中被添加,所以无法在派生类上工作

时间: 2024-11-09 09:49:41

python高级编程之描述符与属性03的相关文章

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

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元描述符 #特点是:使用宿主类的一个或者多个方法来执行一个任务,可能对降低使用提供步骤的类所需要的代码量很有用,比如一个链式描述符可以调用类的一系统方法以返回一组结果,它可以在失败的时候停止,并且配备一个回调机制以获得对过程更多控制,如下 class Chainer(object): def __init__(self,a,b=NotImplementedErro

python高级编程之最佳实践,描述符与属性01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #最佳实践 """ 为了避免前面所有的问题,必须考虑到几下几点: ~1:应该避免多重继承,可以一些设计模式来代替它 ~2:super使用必须一致,在类层次结构中,应该在所有地方都使用super或者彻底不使用它,滥用super和传统调用是一种滥用方法,建议使用super ~3:不要滥用经典类和新式类,两者都具备代码库将导致不同的mro表现 ~4:调

Python高级编程pdf

下载地址:网盘下载 内容简介  · · · · · · <Python高级编程>通过大量的实例,介绍了Python语言的最佳实践和敏捷开发方法,并涉及整个软件生命周期的高级主题,诸如持续集成.版本控制系统.包的发行和分发.开发模式.文档编写等.<Python高级编程>首先介绍如何设置最优的开发环境,然后以Python敏捷开发方法为线索,阐述如何将已被验证的面向对象原则应用到设计中.这些内容为开发人员和项目管理人员提供了整个软件工程中的许多高级概念以及专家级的建议,其中有些内容的意义

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

# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"""它与观察者都有相似的目标,都能在不修改代码的情况下扩展指定的类功能,但是访问者更进一步,它将定义一个负责保存数据类,并将算法推进被称为访问者的其他类中.这种行为和mvc范围(请看:http://en.wikipedia.org/wiki/model-view-controller)相当类似,

Python魔法方法之描述符

1 class myDesc(object): 2 def __init__(self,value=None): 3 self.value = float(value) 4 5 def __get__(self,instance,owner): 6 print "__get__: instance is % owner is %" % (instance,opwner) 7 return self.value 8 9 def __set__(self,instance,value):

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

# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一个代价昂贵或者远程的资源提供了一个非直接访问的机制 在客户和主意之间,如图.它用来优化对高代价主题的访问,比如,在前一章中描述的memoize装饰器可以被认为是一个代理 ,它还可以用提供到一个主题智能访问,例如,大的视频文件可以封闭在代理中,以避免在用户仅仅请教其标题时就将文件载入到内存中 urllib2出给

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

# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言相关解决识方案,最近最流行的书籍:"""gamma.heim.johson和vlissides a.k.a"四人组(gof)"编写的elements of reusable object-oriented software(中文:<设计模式:可复用面向对

python高级编程之装饰器04

from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #with和contextlib #对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如: """ 关闭一个文件, 释放一个锁 创建一个临时代码补丁 在特殊环境中运行受保护代码 ----------- with语句覆盖

python高级编程之访问超类中的方法:super()

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #超类01 #它是一个内建类型,用于访问属于某个对象超类特性 print super#<type 'super'> #如果已习惯于通过直接调用父类将self作为第一参数来访问的特性,可能会出现混乱 #经典方法 class M(object): def s(self): print u'不是超类方法' class S(M): def s(self): M.s(sel