# Классы и объекты

### 1. Что такое класс

* **Класс** — это **шаблон** (описание), по которому создаются объекты.
* Он описывает **состояние** (атрибуты) и **поведение** (методы) будущих объектов.
* В Python класс создаётся с помощью ключевого слова `class`.

***

### 2. Что такое объект

* **Объект** — это **экземпляр класса**.
* Каждый объект имеет свои **данные** (атрибуты) и может выполнять действия (методы), определённые в классе.

***

### 3. Пример

```python
class Car:
    # Конструктор
    def __init__(self, brand, model):
        self.brand = brand  # Атрибут экземпляра
        self.model = model

    # Метод экземпляра
    def drive(self):
        print(f"{self.brand} {self.model} поехала!")

# Создаём объект (экземпляр класса)
car1 = Car("Toyota", "Camry")
car2 = Car("BMW", "X5")

# Вызываем методы
car1.drive()  # Toyota Camry поехала!
car2.drive()  # BMW X5 поехала!
```

***

### 4. Важные моменты для собеседования

* **`self`** — ссылка на текущий объект (экземпляр класса).
* У класса есть:
  * **атрибуты класса** (общие для всех объектов),
  * **атрибуты экземпляра** (уникальные для каждого объекта).
* **Методы класса** (`@classmethod`) и **статические методы** (`@staticmethod`) не требуют обязательного `self`.

***

### 5. Применение в автоматизации тестирования

* **Page Object Model**: каждый класс — это страница, а объекты — конкретные страницы в тестах.
* **Тестовые данные**: можно хранить данные в атрибутах объекта, а методы — для работы с ними.
* **Драйверы**: класс может представлять драйвер браузера, а объект — конкретный запущенный экземпляр браузера.

***

### 6. Мини-пример POM

```python
class LoginPage:
    def __init__(self, driver):
        self.driver = driver

    def open(self):
        self.driver.get("https://site.com/login")

    def login(self, username, password):
        print(f"Ввожу логин: {username}, пароль: {password}")
        # self.driver.find_element(...).send_keys(username)
        # self.driver.find_element(...).send_keys(password)
        # self.driver.find_element(...).click()

# В тесте
driver = object()  # Заглушка вместо реального веб-драйвера
page = LoginPage(driver)
page.open()
page.login("admin", "1234")
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/klassy-i-obekty.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
