Вы можете думать об этом как о memoizedclass property.
Хотя classproperty не питон встроенной, легко реализовать:
class classproperty(object):
""" @[email protected] """
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
То, что осталось теперь memoizing, поэтому декорированное функция только получает вызов один раз, а будущие вызовы возвращают значение, вычисленное в первый раз. Это может быть сделано путем «инъекций» значение в A.__dict__
, который вызывает будущие вызовы для доступа к нему напрямую, вместо classproperty:
class memoized_classproperty(object):
""" @[email protected] """
def __init__(self, f):
self.f = classmethod(f)
def __get__(self, instance, owner):
# get the value:
value = self.f.__get__(instance, owner)()
# inject the value into class's __dict__ before returning:
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'? Почему бы не предоставить метод класса для их инициализации или какой-либо заводской метод динамического создания класса? – jonrsharpe
у вас будут какие-то объекты (переменные), которые являются «глобальными» в вашем классе, а затем функция внутри класса, которая принимает ввод, и делает расчет –
@ JohnRuddell..это, чтобы вызвать эту функцию? –