class Huy:
    norm_length = 15 # атрибут класса, доступен в Huy.norm_length
 
    def __init__(self, length, width):
        """Инициализатор объекта класа Хуй, создает не класс, а конкретный хуй
        с конкретными параметрами"""
        self.length = length # записываем переданные при создании аргументы в качестве атрибутов для хуя
        self.width = width
 
    def extend(self, length):
        """Увеличиваем хуй. Чтобы увеличить хуй, у нас должен быть конкретный хуй
        Мы же не можем увеличить абстрактный хуй, правильно? Вот мы и передаем его
        как селф - при выполнении кода он заменится на конкретный объект хуя, для
        которого мы вызываем метод
        например hui.extand(3) - будет равносильно Huy(self=hui, length=3)
        """
        self.length += length
 
    def is_norm(self):
        """Проверяет, нормальный у тебя хуй или ты короткоствол"""
        # атрибуты класса передаются объекту поэтому можем обратиться к ним через self
        return self.length >= self.norm_length 
 
    @classmethod
    def change_norm_length(cls, delta):
        """Метод класса, тут мы можем изменить атрибуты класса и получить доступ 
        к другим методам класса"""
        cls.norm_length += delta
 
    @staticmethod
    def convert_sm_to_dm(size_in_sm):
        """Просто функция которая превращает сантиметры в дециметры"""
        return size_in_sm / 10
        
huy = Huy(14, 1) # вызывается инит, создаются атрибуты huy.length и huy.width
huy.is_norm() # вызывается Huy.is_norm(huy), возвращается False
huy.extend(3) # вызывается Huy.extend(huy, 3), huy.length = 17
huy.is_norm() # True
huy.change_norm_length(1) # изменяется атрибут КЛАССА, изменения актуальны для всех объектов хуев
Huy.change_norm_length(2) # обе строки вызывают один и тот же метод, норма теперь равна 18
huy2 = Huy(17, 6); huy2.is_norm() # False
huy.is_norm() # False
huy.convert_sm_to_dm(huy.length) # объект хуя не передается, поэтому надо передавать его явно