'''
Информация взята из хорошего видео https://youtu.be/-AGCBEb09eI
'''

# Объявляем класс под названием myclass
# (название может быть любым другим)
class myclass:
    # Указываем значения аргументов-свойств класса
    arg1 = 'Я первое свойство класса'
    arg2 = 'Я второе свойство класса'

    # Функция конструктор которая запускается при инициализации класса
    def __init__(self, arg0):  # аргумент self должен быть во всех методах класса.
        # arg0 это аргумент который передается классу при его создании
        # Может быть только в конструкторе класса
        print('Я ' + arg0 + ' класса, я родился')

    # Функция внутри класса является его методом
    def gethello(self, username):
        # аргумент self должен быть во всех методах класса.
        # аргумент username мы придумали сами,
        # будем принимать его при вызове метода
        # во внутреннюю переменную s кладем слово Привет
        # и имя username (аргумент метода)
        s = 'Привет, ' + username
        # Метод  возвращает значение внутренней переменной s
        return s


# Создаем экземляр класса в переменной a
a = myclass('первый экземпляр')
# В переменную b помещаем результат метода a.gethello,
# передав методу аргумент 'Елена'
b = a.gethello('Елена')
# Печатаем переменную b
print(b)

# Печатаем первое свойство экземпляра класса
print(a.arg1)
# Изменяем свойство arg2 у данного экземпляра класса
a.arg2 = 'Новое значение второго свойства'
# Печатаем второе свойство экземпляра класса
print(a.arg2)

# Создаем еще один экземпляр класса
c = myclass('второй экземпляр')
# Видим что его свойство arg2 осталось прежним
print(c.arg2)


# Создаем дочерний класс myclass2 из ранее созданного myclass
# c помощью наследования и добавляем в него arg3
# и метод getgoodbye
class myclass2(myclass):
    arg3 = 'Я третье свойство, меня не было в myclass'

    # Добавляем метод getgoodbye которого не было в myclass
    def getgoodbye(self, username):
        s = 'До свидания, ' + username
        return s


# Убедимся что в дочернем классе сохранились все свойства и методы
# родительского класса и добавились новые
# Создаем экземпляр класса myclass2
d = myclass2('экземпляр дочернего')
# Печатаем аргументы-свойства класса
print(d.arg1)
print(d.arg2)
print(d.arg3)
# Проверяем работу методов-функций класса
print(d.gethello('Василий'))
print(d.getgoodbye('Василий'))


# Создадим еще один класс унаследовав его от myclass2
# и переопределим в нем метод gethello
# продемонстрировав полиморфизм

class myclass3(myclass2):
    # Переопредилим объявленный в родительских классах
    # метод gethello
    def gethello(self, username):
        s = 'Саламалейкум, о уважаемый ' + username
        return s


e = myclass3('класс унаследованный от myclass2')
print(e.gethello('Артём'))