Skip to content

Instantly share code, notes, and snippets.

@geekKeen
Last active December 25, 2017 03:55
Show Gist options
  • Save geekKeen/1d7290f267824da362dff015ad3576a0 to your computer and use it in GitHub Desktop.
Save geekKeen/1d7290f267824da362dff015ad3576a0 to your computer and use it in GitHub Desktop.
Python 描述符以及property
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)
# 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 {}
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)
@geekKeen
Copy link
Author

  1. __get__ 参数为 owner 的instance 和 Owner 的Class

@geekKeen
Copy link
Author

geekKeen commented Oct 9, 2017

property 的使用方法

  1. 针对单属性的get set del, 是很好的方法
  2. 针对多个属性的操作, 如果功能相同, 第二种操作很好

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