<jupyter_start><jupyter_text>Обектно-ориентирано програмиране Нека се опитаме да пресъздадем състезание между автомобили в компютърна програма.  За да го направим ще трябва да представим автомобилите по някакъв начин в нашата програма.  Добре, да започваме. Какво има в един автомибил?  Шаси, 4 гуми, прозорци, врати, фарове, огледала, чистачки, багажник, резервна гума ...  Нещата започнаха да стават доста сложни.  Дорбре всъщност имаме ли нужда от тези всички тези неща?  С какво ще ни помогне това че знаем колко врати има автомобила?  Ами с нищо. И затова трябва да игнорираме всичко, което не ни е нужно за да решим проблема.Игнорирането на ненужните детайли и извличането на съществените се нарича `абстракция` и едноот най-важните и най-трудни за научаване неща в програмирането.  Та да се върнем на нашата кола. Какво е нужно наистина да занем за нея?  Ами зависи от това колко реалистично искаме да представим състезанието.В нашия случай автомобилите ще имат само две свойства: - скорост - изминат път - име, за да ги отличаваме един от другДобре как ще представим автомобилите в Python код.  Python e т.н. обектно-ориентиран език за програмиране и най-естествения начин е да ги представим като обекти.Какво е `обкет`?  `Обект` е `нещо` (не се безпокойте, ще дам конкретен пример), което има определени свойства и поведение.  Замислете се - в реалния свят всяко нещо има свойства и поведение, т. е. може да представим всичко като обект.Помислете за реални примери за обекти.  Ето няколко:* Птица - свойства: вид, възраст, тегло; поведение - лети, спи, храни се* Топка - свойства: радиус, тегло; поведение - движи се* `...`Как се работи с обекти в Python.  Нека сме създали нашия обект автомобил наречен `car` (ще разберете как след малко).  Достъпът до свойстовa (атрибути, property) става с оператор `.`  ```car.speed   това е скоростта на автомобилаcar.pat   това е пътя изминат от автомобилаcar.name  това е името на автомобила```Поведението на обектите се изразява чрез т. н. методи. Методите са просто функции, които имат лесен достъп до обекта.Методите се извикват както функции.```car.move()```Добре как се създават обекти. За целта се изплзват класове.  Най-просто казано класът е шаблон, по който се създават обекти.  В Python клас се дефинира по следния начин:<jupyter_code>class Car:

    def __init__(self, name, speed):
        """
        Този метод е по-специален. Той се извиква при създаване на обекта.
        Той дава начална стойност на атрибутите на обекта.
        """
        self.name = name
        self.speed = speed
        self.path = 0

    def move(self):
        """
        Това е метод. Дефинира се по същия начин както функция.
        Разликата е, че той получавас параметър `self`, който е самия обект
        """
        self.path = self.path + self.speed
        print('Car %s has traveled %d km' % (self.name, self.path))<jupyter_output><empty_output><jupyter_text>В Python обект се създава по следния начин:<jupyter_code>car1 = Car('car1', 10)  # това извиква `__init__` с аргументи name='car1' и speed=10
car2 = Car('car2', 15)  # това извиква `__init__` с аргументи name='car2' и speed=15<jupyter_output><empty_output><jupyter_text>И сега може да си организираме състезание.<jupyter_code>cars = [car1, car2]

has_winner = False
while not has_winner:
    for car in cars:
        car.move()
        if car.path > 100:
            print('Car %s wins' % car.name)
            has_winner = True<jupyter_output>Car car1 has traveled 10 km
Car car2 has traveled 15 km
Car car1 has traveled 20 km
Car car2 has traveled 30 km
Car car1 has traveled 30 km
Car car2 has traveled 45 km
Car car1 has traveled 40 km
Car car2 has traveled 60 km
Car car1 has traveled 50 km
Car car2 has traveled 75 km
Car car1 has traveled 60 km
Car car2 has traveled 90 km
Car car1 has traveled 70 km
Car car2 has traveled 105 km
Car car2 wins<jupyter_text>Сега е ваш ред.Дефинирайте калс, който представя дистанционно управление за телевизор.Той трябва да има атрибути за номер на канал и ниво на звука.Пример за използване:<jupyter_code>remote_control = RemoteControl()
print(remote_control.channel_number)
# трябва да изпечата 1
remote_control.channel_up()
print(remote_control.channel_number)
# трябва да изпечата 2
print(remote_control.volume)
# трябва да изпечата 50
remote_control.volume_up()
print(remote_control.volume)
# трябва да изпечата 51
remote_control.mute()
print(remote_control.volume)
# трябва да изпечата 0<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.06611570247933884, 'fraction_numerical': 0.016082197900379718, 'mean_word_length': 4.008948545861298, 'pattern_counts': {'":': 0, '<': 16, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '134598', 'license': 'Apache-2.0', 'n_tokens_mistral': 1793, 'n_tokens_neox': 2005, 'n_words': 593, 'path': 'lectures/Object-oriented programming.ipynb', 'repo_name': 'YAtOff/python0', 'size': '4477'}