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 注释;