python 描述符(_get_、_set_、_delete_、TODO)

0.概述

python描述符是对象属性,仅针对新样式的类调用。Python 描述符属于元编程(操作代码的代码)的范畴。描述符通过特殊类进行访问,这些类允许: -- 管理另一个类的属性和 -- 实现用于获取、设置和删除的接口。 我们也可以说描述符是对象属性,属性访问被描述符协议中的一种方法覆盖。

这些方法包括 __get__()、__set__() 和 __delete__()。现在的问题将是为什么要使用描述符??描述符被认为是最强大和最有趣的,因为:

-- 它们为提供了以有序方式处理输入的功能

-- 它们是可重用的属性,可以避免重复的代码。

-- 它们为用户提供了一个强大的验证工具,仅允许根据请求获取特定类型的数据。

1.描述符

创建描述符:-有三种方法可以创建描述符:

类型1:如果希望将描述符用于许多不同的类和属性。例如:用于类型检查 描述符类的结构如下:

class descriptor(object):
  def __get__(self, instance owner):
    pass
  def __set__(self, instance, self):
    pass
  def __del__(self, instance)
    pass

-- 描述符允许发送一些特殊属性。self 是描述符的实例,instance 是类的实例或整个描述符的实例,owner 是该实例所属的类型或类。例如:

class Descriptor(object):
  def __init__(self):
    self._name = ";"
  def __get__(self, instance, owner):
    print "Getting: %s" % self._name return self._name
  def __set__(self, instance, name):
    print "Setting: %s" % name self._name = name.title()
  def __delete__(self, instance):
    print "Deleting: %s" %self._name del self._name

class Person(object):
  name = Descriptor()

可以看到输出如下:

>>> user = Person()
>>> user.name = 'john smith'
Setting: john smith
>>> user.name
Getting: John Smith 'John Smith'
>>> del user.name
Deleting: John Smith

调用描述符类会覆盖 get、set 和 delete 方法。

类型 2 :创建描述符的最简单方法是使用属性类型。通过使用属性类型,我们只能为属性创建描述符。创建property()的语法为: property(fget=None, fset=None, fdel=None, doc=None) 其中 fget 属性获取方法 fset 的属性集方法, fde是 attribute delete 方法。

class Person(object):
  def __init__(self):
    self._name = ';'
  def fget(self):
    print "Getting: %s" % self._name
    return self._name
  def fset(self, value):
    print "Setting: %s" % value
    self._name = value.title()
  def fdel(self):
    print "Deleting: %s" %self._name
  del self._name
    name = property(fget, fset, fdel, "I'm the property.")

注意:- -- 输出将与类型 1 的输出相同。-- 区别在于 property() 属性用于定义系统中的只读属性。-- fset、fget 和 fdel 方法是可选的 -- 如果我们尝试为属性赋值,它会显示类似

name = property(fget, None, fdel, "I'm the property")
user.name = 'john smith'
Traceback (most recent call last):
File stdin, line 21, in m芯dule
user.name = 'john smith'
AttributeError: can't set attribute

类型 3 :使用属性装饰器创建描述符,属性装饰器是属性类型、方法和 Python 装饰器的组合。什么是 Python 装饰器?装饰器是 python 中的一个可调用对象,它采用函数/方法/类定义作为参数,并返回其类型的替换,即。它用于修改函数/方法/类定义。例如:-

>>> def outer(some_func):
... def inner():
... print "before some_func"
... ret = some_func() # 1
... return ret + 1
... return inner >>> def foo():
... return 1
>>> decorated = outer(foo) # 2
>>> decorated() before some_func
2

我们可以用 foo 本身替换装饰的类,这样就不需要创建新的类了。这将用装饰的类重新分配旧类:

现在 foo 是原始 foo 的装饰版本, @符号用于为函数分配装饰器。对于上面的例子,我们可以写成 @outer >>>foo 这将把装饰器外部分配给函数 foo。 现在使用装饰器创建描述符如下:

#The below is an example for decorator.
class Person(object):
  def __init__(self):
    self._name = ';'
  @property
  def name(self):
    print "Getting: %s" % self._name
    return self._name
  @name.setter
  def name(self, value):
    print "Setting: %s" % value
    self._name = value.title()
  @name.deleter
  def name(self):
    print "Deleting: %s" % self._name
    del self._name

代码结构会相对复杂,并且有很多代码。为了解决这个问题,描述符的概念出现了,上述类型 1 将解决此类问题。

2.TODO

TODO 自然表示需要做而未做的一些待完成的事项,有助于事后的检索,以及对整体项目做进一步的修改迭代。

# TODO(kl@gmail.com): Use a "*" here for string repetition.
# TODO(Zeke) Change this to use relations.
最好在注释中包含一个截止日期(“2009年11月解决”)或等待一个特定事件的发生(“等到所有的客户都可以处理XML请求就移除这些代码”)。

一些基本要求和规范:

TODO注释应该在所有开头处包含”TODO”字符串,
紧跟着是用括号括起来的你的名字, email地址或其它标识符.
然后是一个可选的冒号. 接着必须有一行注释, 解释要做什么. 主要目的是为了有一个统一的TODO格式,
这样添加注释的人就可以搜索到(并可以按需提供更多细节).
在 PyCharm 中,使用 Alt + 6 快捷键,可快速调出项目中的全部 TODO 注释;

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scott198512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值