0

0

python描述符descriptor(二)

黄舟

黄舟

发布时间:2016-12-23 17:38:57

|

1570人浏览过

|

来源于php中文网

原创

python内置的描述符

python有些内置的描述符对象,property、staticmethod、classmethod,python实现如下:

class Property(object):
   def __init__(self,getf,setf,delf,doc):
       self.getf=getf
       self.setf=setf
       self.delf=delf
       self.doc=doc
   def __get__(self,instance,own=None):
       if instance is None:
           return self
       if  self.getf is None:
           raise AttributeError
       return self.getf(instance)
   def __set__(self,instance,value):
       if self.setf is None:
           raise AttributeError
       self.setf(instance,value)
   def __del__(self,instance):
       if self.delf is None:
           raise AttributeError    
       self.delf(instance)
class StaticMethod(object):
   def __init__(self,func):
       self.func=func
   def __get__(self,instance,own=None):
       return self.func
class ClassMethod(object):
   def __init__(self,func):
       self.func=func
   def __get__(self,instance,own=None):
       if own is None:
           own=type(instance)
       def callfunc(*args):
           return self.func(own,*args)
       return callfunc

为属性值设置别名

有时候你想用一个属性名作为另一个属性名的别名,比如设置一些属性的默认值必须和其他属性的当前值一样,而且还需要独立的设置和删除。

class DefaultAlias(object):
   def __init__(self,name):
       self.name=name
   def __get__(self,instance,own):
       if instance is None:  #类属性访问时
           return self
       return getattr(instance,self.name).title()
class Person(object):
   def __init__(self,name,aliasname=None):
       self.name=name
       if aliasname is not None:
           self.aliasname=aliasname
   aliasname=DefaultAlias('name')
>>> p=Person('sam')
>>> p.aliasname
'Sam'
>>> p.aliasname='jack'
>>> p.aliasname
'jack'
>>> del p.aliasname
>>> p.aliasname
'Sam'

立即学习Python免费学习笔记(深入)”;

这样就为属性name设置了一个别名aliasname,或者说把aliasname的值存储在了name中。DefaultAlias并不是数据描述符,因为它没有__set__方法,而是一个non-data描述符。所以我们给一个实例属性赋值时(p.aliasname='jack'),实例会正常地记录属性,而且实例属性会覆盖掉类属性。这样aliasname属性就能单独的设置而不影响name属性了。当我们del p.aliasname时,删除了实例的属性,类属性又会再次显现出来。

对于某些开发的类,如果要保持后续版本的兼容性,可以用新名称来命名方法和属性,同时保留旧名字的可用性。

class OldAlias(object):
   def __init__(self,name,oldname):
       self.name=name
       self.oldname=oldname
   def _warn(self):
       print 'use %r,not %r'%(self.name,self.oldname)
   def __get__(self,instance,own):
       self._warn()
       if instance is None:  
           return self
       return getattr(instance,self.name)
   def __set__(self,instance,value):
       self._warn()
       setattr(instance,self.name,value)
   def __del__(self,instance):
       self._warn()
       delattr(instance,self.name)
class NewClass(object):
   def __init__(self,newname):
       self.newname=newname
   oldname=OldAlias('newname','oldname')
>>> c=NewClass('a')
>>> c.oldname
use 'newname',not 'oldname'
'a'

使用这个类的旧代码会使用类属性oldname,同时一个警告信息被打印,鼓励用户使用新属性newname。

缓存属性值

企站帮企业网站管理系统1.0
企站帮企业网站管理系统1.0

一、源码描述这是一款比较简单的企业管理系统源码,界面美观大方,功能简单,特别适合初学者学习研究,系统运行十分流畅,可以作为二次开发,同时也是可以帮助初学者增长知识的优秀代码。二、功能介绍主要功能:企业动态,产品介绍 ,免费下载,定制服务,该源码比较适合新手学习和二次开发使用。三、源码特点1、网站布局:采用目前最先进的布局方式DIV+CSS,符合W3C的标准和Web2.0的风格。2、程序设计模块化,

下载

根据需求计算实例属性或类属性的值,并提供自动化的缓存。

class CachedAttribute(object):
   def __init__(self,method,name=None):
       self.method=method
       self.name=name if name else method.__name__
   def __get__(self,instance,own):
       if instance is None:
           return self
       result=self.method(instance)
       setattr(instance,self.name,result)
       return result
class MyObject(object):
   def __init__(self,n):
       self.n=n
   @CachedAttribute
   def square(self):
       return self.n*self.n
>>> m=MyObject(2)
>>> m.square
4
>>> m.n=5
>>> m.square
4
>>> del m.square
>>> m.square
25

在首次访问m.square后,square属性就被缓存在实例m中,当改变实例属性n时,square属性不会改变。如果需要清除缓存,del m.square即可,再次访问m.square属性square的值会被再次计算。

缓存类属性:

class CachedClassAttribute(CachedAttribute):
   def __get__(self,instance,own):
       return super(CachedClassAttribute,self).__get__(own,own)
class MyClass(object):
   class_attr=24
   @CachedClassAttribute
   def square(cls):
       return cls.class_attr*cls.class_attr

这样类的所有实例都有同样的缓存值了:

>>> a=MyClass()
>>> b=MyClass()
>>> a.square
>>> print a.square
576
>>> print b.square
576
>>> print MyClass.square
576

 以上就是python描述符descriptor(二)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

12

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

22

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

2

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

40

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号