Классы

Обновлено: 2024-03-12
4 мин

Все в Python является объектом. Это означает, что каждая сущность в Python имеет методы и значения. Причина в том, что в основе всего лежит класс.

>>> x = "Some String"
>>> dir(x)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count',
'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum',
'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust',
'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']

Здесь у нас есть строка, присвоенная переменной x. Может показаться, что это не так много, но у этой строки есть много методов. Если вы используете ключевое слово dir в Python, то сможете получить список всех методов, которые можно вызвать для вашей строки.

Технически мы не должны напрямую вызывать методы, начинающиеся с символов подчеркивания, но их можно вызвать.

Это значит, что строка основана на классе, а x- это экземпляр этого класса!

В Python мы можем создавать свои собственные классы.

Создание класса

Создать класс в Python очень просто. Вот очень простой пример:

class MyClass:
    my_attribute = 42

    def my_method(self):
        print("Hello, world!")

Здесь мы создали класс MyClass, который имеет атрибут my_attribute со значением 42 и метод my_method, который просто выводит сообщение в консоль.

Атрибуты класса могут быть доступны как через экземпляр класса, так и напрямую через класс:

print(MyClass.my_attribute)  # 42

my_object = MyClass()
print(my_object.my_attribute)  # 42

Методы класса принимают в качестве первого аргумента экземпляр класса (self) и могут иметь доступ к атрибутам класса и вызывать другие методы класса:

class MyClass:
    my_attribute = 42

    def my_method(self):
        print(self.my_attribute)

    def my_other_method(self):
        self.my_method()

Здесь мы добавили метод my_other_method, который просто вызывает метод my_method.

В Python существуют специальные методы, которые определяются с помощью двойного подчеркивания в начале и в конце названия метода. Например, метод __init__ используется для инициализации экземпляра класса при его создании (конструкторы):

class MyClass:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print("Hello, " + self.name + "!")

Здесь мы определили метод __init__, который принимает аргумент name и сохраняет его в атрибуте name. Метод say_hello использует этот атрибут для вывода сообщения.

Классы могут наследовать друг от друга, позволяя переопределять и расширять функциональность базового класса. Для этого используется ключевое слово super:

Что такое self?

Классы Python нуждаются в способе обращения к самим себе. Это не какое-то самовлюбленное созерцание класса. Напротив, это способ отличить один экземпляр от другого.

Слово self - это способ самоописания любого объекта, в буквальном смысле.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def introduce(self):
        print("My name is {} and I'm {} years old.".format(self.name, self.age))

person1 = Person("Alice", 25)
person1.introduce()

Здесь self.name и self.age представляют атрибуты объекта Person, который вызывает метод introduce. Без использования self мы не могли бы получить доступ к атрибутам объекта из метода.

Наследование

Наследование - это механизм, который позволяет создавать новый класс на основе уже существующего, наследуя его свойства и методы. Класс, от которого наследуется новый класс, называется родительским классом, а новый класс - дочерним классом.

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

class Animal:
    def __init__(self, name, species):
        self.name = name
        self.species = species
    
    def speak(self):
        print("I am an animal.")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name, species="Canis")
        self.breed = breed
    
    def speak(self):
        print("Woof!")

class Cat(Animal):
    def __init__(self, name, color):
        super().__init__(name, species="Felis")
        self.color = color
    
    def speak(self):
        print("Meow!")

dog = Dog("Buddy", "Golden Retriever")
cat = Cat("Luna", "Black")

print(dog.name)   # Output: Buddy
print(dog.breed)  # Output: Golden Retriever
dog.speak()       # Output: Woof!

print(cat.name)   # Output: Luna
print(cat.color)  # Output: Black
cat.speak()       # Output: Meow!

В этом примере класс Animal является родительским классом для классов Dog и Cat.

Класс Dog наследует свойства name и species от класса Animal и добавляет свой собственный атрибут breed.

Класс Cat также наследует свойства name и species от класса Animal и добавляет свой собственный атрибут color.

У каждого класса есть свой метод speak, который переопределяет метод speak родительского класса Animal. Когда вызывается метод speak для экземпляра класса Dog, выводится строка “Woof!”, а когда вызывается для экземпляра класса Cat, выводится строка “Meow!”. (Полиморфизм)

Ресурсы: