Вопрос противоречив: static
и property
не идут вместе таким образом.Статические атрибуты в Python - это просто атрибуты, которые назначаются только один раз, и сам язык включает в себя очень большое их количество.( Большинство строк являются interred, все целые числа <определенное значение предварительно построены и т. Д. Например, <a href="https://docs.python.org/3/library/string.html" rel="nofollow noreferrer"> модуль string
.).Самый простой подход - статически назначать атрибуты после построения, как показывает wim:
class Foo:
...
Foo.first = Foo()
...
Или, как он далее предложил, использовать декоратор класса для выполнения назначений, что функционально аналогично приведенному выше.Декоратор - это, по сути, функция, которой в качестве аргумента передается «оформленная» функция, и она должна возвращать функцию, чтобы эффективно заменить исходную.Это может быть исходная функция, скажем, измененная с некоторыми аннотациями, или может быть совершенно другая функция.Исходная (оформленная) функция может вызываться или не вызываться соответствующим образом для декоратора.
def preload(**values):
def inner(cls):
for k, v in values.items():
setattr(cls, k, cls(v))
return cls
return inner
Затем ее можно использовать динамически:
@preload(zero=0, one=1)
class Foo:
...
Если целью является сохранение некоторыхвремя на общих целочисленных значениях, defaultdict
отображение целых чисел на сконструированные BigInt
с может быть полезно в качестве формы кэширования и упрощенного построения / одноэлементного хранения.(Например, BigInt.numbers[27]
)
Однако проблема использования @property
на уровне класса заинтриговала меня, поэтому я немного покопался.Вполне возможно использовать " объекты протокола дескриптора " (которые возвращает декоратор @property
) на уровне класса, если вы добавите атрибут вверх по иерархии объектной модели в метакласс.
class Foo(type):
@property
def bar(cls):
print("I'm a", cls)
return 27
class Bar(metaclass=Foo):
...
>>> Bar.bar
I'm a <class '__main__.Bar'>
<<< 27
Примечательно, что этот атрибут недоступен из экземпляров:
>>> Bar().bar
AttributeError: 'Bar' object has no attribute 'bar'
Надеюсь, это поможет!