Объектно-ориентированное программирование. Классы, объекты
Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.
Класс — тип, описывающий устройство объектов. Объект — это экземпляр класса. Класс можно сравнить с чертежом, по которому создаются объекты.
Python соответствует принципам объектно-ориентированного программирования. В Python всё является объектами - строки, списки, словари, файлы, всё остальное.
Кроме того, программист может собственноручно написать свой тип данных (класс), определить в нём свои методы и поля.
Это не является обязательным - мы можем пользоваться только встроенными объектами. Однако ООП полезно при долгосрочной разработке программы несколькими людьми, так как упрощает понимание кода.
Приступим теперь собственно к написанию своих классов на Python. Определим собственный класс:
class A:
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.