Avatar ·

Как сделать статическое свойство класса в питоне?

📁 python, ошибка

Пробую так:

class ChatCodes:   _chat = 'cht'   @property   def chat(self):      retu self._chat

если использую так:

print(ChatCodes.chat + 'any_str')

то появляется ошибка:

unsupported operand type(s) for +: 'property' and 'str'

как правильно создать статическое свойство?

Avatar ·

В принципе, объявленный параметр класса со значением - уже может использоваться как статическое свойство

>>> class MyClass:...     param = ""value""...>>> MyClass.param'value'>>>

Это же значение будет доступно и для экземпляра класса. Разве что у экземпляра есть опасность, что значение свойства изменится в процессе работы. Тут стоит позаботиться, чтоб этот параметр не изменялся и/или чтоб обращение к свойству шло исключительно через имя класса, а не экземпляра.

Можно использовать статический метод - объявляется с помощью аннотации @staticmethod. Правда и обращаться к нему придётся как к методу, а не свойству

>>> class MyClass:...     @staticmethod...     def param():...             retu ""value""...>>> MyClass.param<function param at 0x04962A30>>>> MyClass.param()'value'>>>

Если достаточно ленивой инициализации (то есть обращаться к свойству будем через экземпляр класса), то можно использовать аннотацию @property

>>> class MyClass:...     @property...     def param(self):...             retu ""value""...>>> MyClass.param<property object at 0x0474B210>>>> MyClass.param()Traceback (most recent call last):  File ""<stdin>"", line 1, in <module>TypeError: 'property' object is not callable>>>>>> m = MyClass()>>> m.param'value'

Ну и вариант на любителя (на случай, когда значение свойства нужно вычислить):

>>> class MyClass:...     def _method_to_create_static_prop():...             retu ""value""...     param = _method_to_create_static_prop()...     del _method_to_create_static_prop...>>> MyClass.param'value'>>> MyClass._method_to_create_static_propTraceback (most recent call last):  File ""<stdin>"", line 1, in <module>AttributeError: class MyClass has no attribute '_method_to_create_static_prop'>>>

Войдите чтобы оставить ответ

Блоги