Чем можно заменить @property
Python
Middle
Без компании
Чем можно заменить @property
Ответы
Для замены `@property` в Python можно использовать несколько подходов, в зависимости от ситуации:
- **Геттеры/сеттеры (явные методы)**
```
class MyClass:
def __init__(self):
self._x = None
def get_x(self):
return self._x
def set_x(self, value):
self._x = value
```
- **`__getattr__` и `__setattr__`**
Позволяют перехватывать доступ к атрибутам динамически:
```
class MyClass:
def __getattr__(self, name):
if name == 'x':
return self._x
raise AttributeError(name)
```
- **Дескрипторы (`__get__`, `__set__`)**
Полезны для повторного использования логики:
```
class Descriptor:
def __get__(self, obj, objtype=None):
return obj._x
def __set__(self, obj, value):
obj._x = value
class MyClass:
x = Descriptor()
```
- **`functools.cached_property`** (Python 3.8+)
Для ленивых вычислений с кэшированием:
```
from functools import cached_property
class MyClass:
@cached_property
def x(self):
return expensive_computation()
```
Выбор зависит от задачи:
- Для простых случаев — `@property`.
- Для динамических атрибутов — `__getattr__`.
- Для повторяющейся логики — дескрипторы.
- Для кэширования — `cached_property`.