Объектно-ориентированное программирование. Классы, объекты

Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

Класс — тип, описывающий устройство объектов. Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты.

Python соответствует принципам объектно-ориентированного программирования. В Python всё является объектами - строки, списки, словари, файлы, всё остальное.

Кроме того, программист может собственноручно написать свой тип данных (класс), определить в нём свои методы и поля.

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

Приступим теперь собственно к написанию своих классов на Python. Определим собственный класс:

class A:
    pass
Здесь pass - это инструкция, которая "ничего не делает". Что-то написать в теле блока class мы должны, но не хотим. Тогда мы можем написать pass.

Теперь мы можем создать несколько экземпляров этого класса:

>>> class A:
...     pass
...
>>> a = A()
>>> b = A()
>>> a.arg = 1  # у экземпляра a появился атрибут arg, равный 1
>>> b.arg = 2  # а у экземпляра b - атрибут arg, равный 2
>>> print(a.arg)
1
>>> print(b.arg)
2
>>> c = A()
>>> print(c.arg)  # а у этого экземпляра нет arg
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'arg'

Классу возможно задать собственные методы:

>>> class A:
...     def say_hello(self):
...         return "Hello Pyplanet"
...
>>> a = A()
>>> a.say_hello()
'Hello Pyplanet'

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

Это так же, как и доступ к атрибутам модуля (например math.sin(1)). Более того, модуль - это такой же объект; а его методами и атрибутами является то, что записано в файле модуля.

При вызове метода у экземпляра класса всегда происходит вызов классового метода с автоматической передачей экземпляра класса в качестве первого аргумента.

Так исторически сложилось, что в теле метода этот первый аргумент называют self.

Из любого метода можно создавать и изменять атрибуты экземпляра:

class A:
    def set_hello(self):
        self.hello = "Hello Pyplanet"

a = A()
a.set_hello()
print(a.hello)

Выведет Hello Pyplanet.