Статьи

Плавный переподготовка классов и объектов Python

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)

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

Какой тип данных вы всегда хотели создать? Давай и делай это!