В Python каждое значение, которое вы создаёте — строка, число, список и т.д. — это объект. Любой объект в Python наследуется от базового класса object
. Это основа иерархии классов в языке.
class object:
"""
The base class of the class hierarchy.
"""
Класс object
является базовым для всех остальных классов. Это значит, что любой пользовательский класс или встроенный тип данных напрямую или опосредованно наследуется от него.
Предположим, у нас есть несколько классов:
class Person:
pass
class Doctor(Person):
pass
class Architect(Person):
pass
class Teacher(Person):
pass
На схеме это можно представить следующим образом:
object
│
Person
┌───┬───┬────┐
Doctor Architect Teacher
Здесь, несмотря на отсутствие явного указания, класс Person
на самом деле наследуется от object
. Это происходит автоматически, и если захотите, вы можете явно указать это:
class Person(object):
pass
Теперь давайте проверим, что классы действительно наследуются от object
с помощью функций issubclass
и isinstance
:
print(issubclass(Person, object)) # True
print(isinstance(Person(), object)) # True
object
Класс object
предоставляет большое количество методов по умолчанию. Их можно увидеть с помощью функции dir()
:
print(dir(object))
Среди методов можно заметить магические методы вроде __eq__
, __str__
, __init__
, которые дают базовую функциональность всем объектам в Python.
Например, метод __str__
позволяет нам использовать print()
для объектов. Метод __eq__
позволяет сравнивать объекты:
class MyClass:
pass
a = MyClass()
b = MyClass()
print(a == b) # False (сравнение через __eq__)
print(str(a)) # вывод информации об объекте (работает __str__)
Встроенные типы данных в Python, такие как int
, str
, list
, также наследуются от класса object
. Посмотрим на несколько примеров:
class int(object):
"""
Integer numbers
"""
class str(object):
"""
String data
"""
class list(object):
"""
Built-in mutable sequence.
"""
Единственным исключением является класс bool
, который наследуется от int
:
class bool(int):
"""
Boolean values: True, False
"""
Вот как выглядит схема наследования для некоторых встроенных типов данных:
object
│
┌───┬────┬────────┼───────────┐
int str list tuple set dict
│
bool
Вы можете создать свой класс, унаследовав его от любого встроенного типа. Например, создадим класс MyList
, который наследуется от списка:
class MyList(list):
def double_append(self, value):
self.append(value)
self.append(value)
ml = MyList()
ml.double_append(10)
print(ml) # [10, 10]
Как видно, объект MyList
получает поведение обычного списка и при этом расширяет его дополнительным методом.
Вот таблица по лекции:
Тема | Описание |
---|---|
Класс object | Базовый класс для всех остальных классов в Python. Любой пользовательский или встроенный класс напрямую или опосредованно наследуется от него. Это основа иерархии классов. |
Пример иерархии наследования | Пример с классами Person , Doctor , Architect , Teacher , которые автоматически наследуются от object . Класс Person , хотя явно не указано, наследует object . Можно явно указать наследование: class Person(object) . |
Проверка наследования | Для проверки, что классы наследуются от object , можно использовать функции issubclass и isinstance : |
- issubclass(Person, object) → True | |
- isinstance(Person(), object) → True | |
Методы и атрибуты object | Класс object предоставляет набор методов по умолчанию, включая магические методы, такие как __eq__ , __str__ , __init__ . Они дают базовую функциональность, например, сравнение объектов через __eq__ или преобразование объекта в строку через __str__ . |
Пример методов object | Создание пользовательского класса MyClass , в котором автоматически доступны методы от класса object : |
- a == b (сравнение через __eq__ ) | |
- print(str(a)) (вывод информации через __str__ ) | |
Иерархия встроенных типов | Встроенные типы данных, такие как int , str , list , также наследуются от класса object . Единственным исключением является класс bool , который наследуется от int . |
Наследование от встроенных типов | Можно наследоваться от встроенных типов данных и расширять их функциональность. Пример класса MyList , который наследуется от list и добавляет новый метод double_append , позволяющий добавить элемент дважды. |
Пример использования | - Создание экземпляра класса MyList , который наследует поведение списка и расширяет его дополнительным методом: |
- ml.double_append(10) | |
- print(ml) → [10, 10] |