Python поставляется со многими встроенными типами данных, такими как dict , list , set и т. Д. Задумывались ли вы, если вы можете создать свои собственные типы данных? Как person
, car
, university
и т. Д.? Возможно ли создание таких типов данных? Да, это возможно в Python, и именно здесь в игру вступают классы и объекты.
В этом уроке я опишу, что подразумевается под классом и объектом , и как мы можем работать с ними в Python.
Классы и Объекты
Как упоминалось выше, классы и объекты предназначены для создания вашего собственного типа данных (то есть пользовательских типов данных). Таким образом, класс является определяемым пользователем типом данных, а создание экземпляров класса (создание экземпляров) означает создание объектов этого типа. В конце концов, классы и объекты считаются основными строительными блоками для Python, который является объектно-ориентированным языком программирования .
Каково было бы создать класс в Python? Простейшая структура классов в Python выглядит следующим образом:
1
2
|
class ClassName:
statements
|
Как видите, определение класса начинается с ключевого слова class
, а className
— это имя класса (идентификатор). Помните, что имя класса следует тем же правилам, что и имена переменных в Python, то есть имя может начинаться только с буквы или подчеркивания _
и может содержать только буквы и цифры. или подчеркивает. Также, ссылаясь на PEP 8 (Руководство по стилю для кода Python), мы видим, что рекомендуется называть классы в стиле CapWords (верхний CamelCase).
Давайте теперь определим класс Person
, который на данный момент не будет содержать ничего, кроме оператора pass
. Как упомянуто в документации Python:
pass
заявление ничего не делает. Его можно использовать, когда синтаксически требуется оператор, но программа не требует никаких действий.
1
2
|
class Person:
pass
|
Чтобы создать экземпляр (объект) этого класса, мы можем просто сделать следующее:
abder = Person()
Это означает, что мы создали новый объект abder
типа Person
. Обратите внимание, что создание объекта просто имеет имя класса и круглые скобки.
Мы можем определить, какой тип abder
и где он находится в памяти, набрав: print abder
. В этом случае вы получите что-то вроде следующего:
<__main__.Person instance at 0x109a1cb48>
Атрибуты
Атрибуты похожи на свойства, которые мы хотим добавить в класс (тип). Например, для нашего класса Person добавим два атрибута: name
и school
, как показано ниже:
1
2
3
|
class Person:
name = »
school = »
|
Теперь мы можем создать новый объект типа Person (экземпляр Person) с более подробной информацией, поскольку он теперь имеет некоторые атрибуты, как показано ниже:
1
2
3
|
abder = Person()
abder.name = ‘Abder’
abder.school = ‘ABC University’
|
методы
Методы похожи на функции в Python в том смысле, что они определены с ключевым словом def
и имеют то же форматирование, что и функции. В нашем классе давайте определим метод, который печатает имя человека и школу. Класс будет выглядеть следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
class Person:
name = »
school = »
def print_name(self):
print self.name
def print_school(self):
print self.school
abder = Person()
abder.name = ‘Abder’
abder.school = ‘XY University’
abder.print_name()
abder.print_school()
|
Я упоминал выше, что методы похожи на функции. Но главное отличие заключается в том, что методам необходимо иметь аргумент с удобным названием self
, который ссылается на объект, к которому вызывается метод (т. Е. Abder). Обратите внимание, что при вызове метода нам не нужно передавать self
в качестве аргумента, так как Python справится с этим за нас.
Если мы не поместим self
в качестве аргумента в print_name()
, вот как Python будет жаловаться:
1
2
3
4
|
Traceback (most recent call last):
File «test.py», line 14, in <module>
abder.print_name()
TypeError: print_name() takes no arguments (1 given)
|
Конечно, вы можете передать более одного аргумента методу. Давайте сделаем процесс печати name
и school
одним способом, следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
|
class Person:
name = »
school = »
def print_information(self, name, school):
print self.name
print self.school
abder = Person()
abder.name = ‘Abder’
abder.school = ‘XY University’
abder.print_information(abder.name, abder.school)
|
Попробуйте запустить программу — вы получили тот же вывод, что и раньше?
инициализация
В предыдущем разделе мы инициализировали name
и school
, дав им пустое значение ' '
. Но есть более элегантный способ инициализации переменных значениями по умолчанию, и здесь инициализация оказывается полезной.
Инициализатор — это специальный метод с именем __init__
(метод считается специальным и будет рассматриваться в особом случае, и поэтому в начале и в конце есть двойные подчеркивания).
Давайте изменим предыдущую программу, чтобы использовать инициализатор. В этом случае программа будет выглядеть следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
class Person:
def __init__(self, n, s):
self.name = n
self.school = s
def print_name(self):
print self.name
def print_school(self):
print self.school
abder = Person(‘Abder’, ‘XY University’)
abder.print_name()
abder.print_school()
|
Обратите внимание, что инициализатор должен иметь два аргумента. Например, если мы не включим аргумент n
в инициализатор, мы получим следующую ошибку:
1
2
3
4
|
Traceback (most recent call last):
File «test.py», line 12, in <module>
abder = Person(‘Abder’, ‘XY University’)
TypeError: __init__() takes exactly 2 arguments (3 given)
|
Итак, суть в том, что с помощью классов вы сможете создавать свои собственные типы данных, а с помощью объектов вы сможете создавать экземпляры этих типов данных. Классы также состоят из атрибутов (свойств) и методов, которые являются действиями, которые мы выполняем над этими атрибутами.
Какой тип данных вы всегда хотели создать? Давай и делай это!