你可以把它看作是一个具有记忆的类属性。
虽然 classproperty 不是 Python 的内置属性,但很容易实现:
class classproperty(object):
""" @classmethod+@property """
def __init__(self, f):
self.f = classmethod(f)
def __get__(self, *a):
return self.f.__get__(*a)()
这可以像这样使用:
class A:
@classproperty
def client1(cls):
print("creating a client1 for %s..." % cls)
return 0
print(A.client1)
print(A.client1)
print(A().client1)
Output:
creating a client1 for <class '__main__.A'>...
0
creating a client1 for <class '__main__.A'>...
0
creating a client1 for <class '__main__.A'>...
0
现在剩下的就是将其记忆化,这样修饰后的函数只会被调用一次,而未来的调用将返回第一次计算出的值。可以通过将该值“注入”到
A.__dict__
中来实现这一点,这会导致未来的调用直接访问它,而不是访问类属性:
class memoized_classproperty(object):
""" @classmethod+@property """
def __init__(self, f):
self.f = classmethod(f)
def __get__(self, instance, owner):
value = self.f.__get__(instance, owner)()
attr = self.f.__func__.__name__
setattr(owner, attr, value)
return value
class A:
@memoized_classproperty
def client2(cls):
print("creating a client2 for %s..." % cls)
return 0
print(A.client2)
print(A.client2)
print(A().client2)
Output:
creating a client2 for <class '__main__.A'>...
0
0
0
global
?为什么不提供一个类方法来初始化它们,或者一些动态创建类的工厂方法呢? - jonrsharpeself.set_gloabals()
方法并且该方法可以查询你的数据库并实际设置这些值。 - John Ruddellif not self.global_mappings:
这样它只会被实例化一次 :) - John Ruddell