• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > Python中用Descriptor实现类级属性(Property)详解

Python中用Descriptor实现类级属性(Property)详解

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了propertydescriptor,c propertydescriptor,python descriptor,descriptor,bad file descriptor等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

上篇文章简单介绍了python中描述器(Descriptor)的概念和使用,有心的同学估计已经Get√了该技能。本篇文章通过一个Descriptor的使用场景再次给出一个案例,让不了解情况的同学可以更容易理解。

先说说decorator

这两个单词确实是有些相似,同时在使用中也是形影不离。这也给人造成了理解上的困难,说装饰器和描述器到底是怎么回事,为什么非得用一个@符号再加上描述器才行。

很多文章也都把这俩结合着讲,我自己看完之后都会觉得很绕。其实学习一个知识点,和做项目开发一个功能是一样的。在功能拆分的时候我们都会尽量的把任务拆分的足够小,然后才分配到开发者头上。这样保证各个任务的独立性,完整性,并且易于做进度管理。在任务开发的时候也不能把你的任务都放到一个函数/接口中去做,以避免各功能间产生高耦合的状况,导致后期难以维护。

再说回到学习一个技术点,如果你总是尝试一下子就要掌握两个或多个技术点,结果可能是忙活了半天,发现还是晕头转向。

擦,好像扯远了。

说Descriptor是Descriptor, Decorator是Decorator,遇到不懂的地方,各个击破,哪里不懂点哪里。所以先说Decorator, 关键点是你要意识到这就是一个语法糖 。所谓语法糖就是让你可以用简单的方式写代码。本质上装饰器(Decorator)就是这样:
def decorator(func):
    def wrapper():
        print 'in decorator'
        func()
    return wrapper

def func():
    print 'in func'

# 把func装饰一下
func = decorator(func)  # 左边的func其实是那个wrapper, 你执行它的时候会,它会帮你执行func()
# 等同于你在定义func的时候加上@
@decorator
def func():
    print 'in func'
</div>

正题:通过Descriptor来做一个类级的Property

常见的Property是这样的:
class Foo(object):
    _name = 'the5fire'

    @property
    def name(self):
        return self._name
</div>

这中property的使用,是实例级的应用。因为只有在 foo = Foo() 之后,才可以 foo.name 。

但是如果我需要一个类级的属性应该怎么做呢,就像是 classmethod一样,不需要实例化类我就可以调用。对应的需求是这样的,定义了一个基类DBManage:
class DBManage(object):
    @classmethod
    def table_name(cls):
        return cls.__name__.lower()

    @classmethod
    def select_all(cls):
        sql = "SELECT * FROM %s""" % cls.table_name()
        # 执行这个语句的代码
        return result
</div>

这其实一个对应着数据库中某张表的基础模型,我希望其他的Model都来继承它,然后可以重用这个table_name的方法(目前还是方法)。

我只需要这么定义User模型即可:
class User(DBManage):
    pass
</div>
然后这么定义Post模型:
class Post(DBManage):
    pass
</div>

这样我如果需要查所有的User数据,只需要 User.select_all() 即可,同理Post也是如此 Post.select_all() 。但此时发现一个有点不爽的事情。那就是基类中的 cls.table_name() 这个代码,table_name看起来就是属性,却需要用调用方法的方式获取。不妥。

于是自定义了一个classproperty:
class classproperty(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, klass):
        return self.func(klass)
</div>

这需要这样,我在DBManage中的代码就可以改为:
class DBManage(object):
    @classproperty
    def table_name(cls):
        return cls.__name__.lower()

    @classmethod
    def select_all(cls):
        sql = "SELECT * FROM %s""" % cls.table_name  # 多么直观
</div>
这就是Descriptor另外的一个使用案例了。
可能有人或有一个小疑问:为毛你不是在sql赋值时直接 sql = "SELECT * FROM %s" % cls.__name__.lower() 。这个问题,问的非常好,原因就一个字:懒。懒得以后每次都得敲那么多代码。

</div>

您可能想查找下面的文章:

  • Python 描述符(Descriptor)入门
  • 深入解析Python中的descriptor描述器的作用及用法
  • 详解Python中的Descriptor描述符类
  • 详解Python中的Descriptor描述符类
  • Python 的描述符 descriptor详解
  • 解密Python中的描述符(descriptor)
  • Python中用Descriptor实现类级属性(Property)详解

相关文章

  • 深入解析Python中的descriptor描述器的作用及用法
  • Python使用MONGODB入门实例
  • 用Python实现QQ游戏大家来找茬辅助工具
  • python dict remove数组删除(del,pop)
  • python共享引用(多个变量引用)示例代码
  • Python urllib、urllib2、httplib抓取网页代码实例
  • Python编程生成随机用户名及密码的方法示例
  • Python 爬虫的工具列表大全
  • 在Python中处理时间之clock()方法的使用
  • 基于asyncio 异步协程框架实现收集B站直播弹幕

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 精确查找PHP WEBSHELL木马的方法(1)
    • Python爬取网页中的图片(搜狗图片)详解
    • 讲解Python的Scrapy爬虫框架使用代理进行采集的方法
    • Python实现简单的多任务mysql转xml的方法
    • python list转dict示例分享
    • Python常用算法学习基础教程
    • PYTHON正则表达式 re模块使用说明
    • 利用Python绘制MySQL数据图实现数据可视化
    • 利用numpy+matplotlib绘图的基本操作教程
    • python实现查询IP地址所在地

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有