Для чего нужно превращать метод класса в атрибут

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


Основные причины

1. Вычислить один раз и использовать как свойство

  • Если метод возвращает значение, которое зависит только от состояния объекта и не меняется, его можно сделать свойством с помощью @property.

  • Это убирает круглые скобки при вызове и делает обращение более "атрибутным" — читается как поле.

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    @property
    def area(self):
        return self.width * self.height

rect = Rectangle(10, 5)
print(rect.area)  # 50, без ()

Применяется в тестировании, например, для вычисления URL страницы на основе конфигурации.


2. Кэширование (ленивые вычисления)

  • С помощью functools.cached_property (Python 3.8+) метод выполняется один раз, а результат сохраняется в атрибут.

  • Это полезно, когда вычисление дорогое (например, запрос в API или БД), и нет смысла повторять его каждый раз.

from functools import cached_property
import time

class DataLoader:
    @cached_property
    def big_data(self):
        time.sleep(2)  # имитация долгой операции
        return [1, 2, 3]

loader = DataLoader()
print(loader.big_data)  # вычисляется 1 раз
print(loader.big_data)  # берется из кэша

3. Связывание метода с переменной

  • Иногда нужно сохранить метод в переменной для удобства передачи в другую функцию, например, как колбэк.

class Math:
    def add(self, a, b):
        return a + b

m = Math()
plus = m.add  # теперь это переменная
print(plus(2, 3))  # 5

🔹 В автоматизации тестирования

  • @property удобно использовать в Page Object Model для локаторов:

class LoginPage:
    @property
    def username_field(self):
        return self.driver.find_element(By.ID, "username")

Теперь можно писать:

login_page.username_field.send_keys("test_user")

вместо:

login_page.username_field().send_keys("test_user")
  • @cached_property полезно, если локатор или данные ищутся долго, но не меняются в течение теста.

Last updated

Was this helpful?