Last active
December 25, 2017 03:55
-
-
Save geekKeen/1d7290f267824da362dff015ad3576a0 to your computer and use it in GitHub Desktop.
Python 描述符以及property
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Integer(object): | |
def __init__(self, name): | |
self.name = name | |
def __get__(self, instance, cls): | |
if instance is None: | |
return self | |
else: | |
return instance.__dict__[self.name] | |
def __set__(self, instance, value): | |
if not isinstance(value, int): | |
raise TypeError('Expected an int') | |
instance.__dict__[self.name] = value | |
class Point(object): | |
x = Integer('x') | |
y = Integer('y') | |
def __init__(self, x, y): | |
self.x = x | |
self.y = y | |
if __name__ == '__main__': | |
p = Point(2,3) | |
# __get__ 描述符参数 | |
p.x # Point.x.__get__(p, Point) | |
Point.x # Point.x.__get__(None, Point) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# sqlalchemy.util | |
class memoized_property(object): | |
""" | |
like cached_property, memoized_property is fget property | |
so we can get more infomation about property | |
__get__ can insert into obj an attr | |
""" | |
def __init__(self, fget, doc=None): | |
self.fget = fget | |
self.__doc__ = fget.__doc__ or doc | |
self.__name__ = fget.__name__ | |
def __get__(self, obj, cls): | |
if obj is None: | |
return self | |
obj.__dict__[self.__name__] = result = self.fget(obj) # 传 obj 是绑定实例 | |
return result | |
def _reset(self, obj): | |
memoized_property.reset(obj, self.__name__) | |
@classmethod | |
def reset(obj, name): | |
obj.__dict__.pop(name, None) | |
class Object(object): | |
# info = memoized_property(info) | |
@memoized_property | |
def info(self): | |
return {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class A(object): | |
def _get_value(self): | |
return 'get' | |
def _set_value(self, value): | |
return value | |
value = property(_get_value, _set_value, doc='') | |
del _get_value, _set_value | |
def cache_property(key, empty, type): | |
return property(lambda x: x._get_cache_value(key, empty, type), | |
lambda x, v: x._set_cache_value(key, v, type), | |
lambda x: x._del_cache_value(key), | |
'accessor for %r' % key) | |
class _CacheControl(UpdateDictMixin, dict): | |
no_cache = cache_property('no-cache', '*', None) |
property 的使用方法
- 针对单属性的get set del, 是很好的方法
- 针对多个属性的操作, 如果功能相同, 第二种操作很好
trick 的点:
首先 property 的参数有fget, fset, fdel 三个参数
每个参数都是可以调用的对象
注意第一种方法中的 property的声明, 说明了该函数在 class A 的命名空间中, 没有带类名
同时三个函数对象调用时第一参数是一个object 实例
不同的是 fset 的参数有两个
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
__get__
参数为 owner 的instance 和 Owner 的Class