Во время программирования можно обнаружить, что одни и те же функции снова и снова используются для аналогичных объектов, имеющих одинаковый план, аналогичные характеристики и общие функции. Объектно-ориентированное программирование направлено на решение этой проблемы, снижающей эффективность, путем кластеризации информации и функций, применимых к группе похожих «объектов», в одном месте. Чтобы прояснить это, мы рассмотрим эту идею на простом примере; собаки.

Ядро ООП - это класс; по сути, это структура для всех объектов, назначенных классу. Итак, нашим классом будут собаки:

class Dogs:
    pass
#first letter of the class capitalized due to naming convention
#insert “pass” as the placeholder for future code

Теперь, чтобы добавить к классу сущность, мы добавим метод экземпляра. Метод экземпляра аналогичен функции, но определяется внутри класса. Итак, в этом примере мы можем создать два метода экземпляра, которые будут применимы к любому объекту класса Dogs; лаять и есть.

class Dogs:
    def bark(self):
        return "Wooof"
    def eat(self):
        return "Yum!"

Обратите внимание на аргумент self в методах экземпляра. Это означает, что позже, когда мы создадим уникальный экземпляр класса, объект, который является экземпляром, будет передан в качестве аргумента. Слово «я» употреблено условно.

Теперь, чтобы использовать этот класс и связанные с ним методы экземпляра для отдельного объекта, нам нужно создать экземпляр этого класса. Давайте создадим экземпляр класса для моей собаки Ринго.

ringo = Dogs()
ringo.bark()
'Wooof'

Обратите внимание, что когда мы создаем экземпляр для Ринго, мы устанавливаем его переменную равной «Dogs ()», уникальному экземпляру класса, а не только «Dogs», самому классу. Когда мы затем перейдем к вызову метода экземпляра, bark (), Ringo будет передано в качестве аргумента, и мы получим результат метода; "Вау-у-у-у".

Теперь предположим, что мы хотим добавить общие характеристики, которые верны для всех объектов, связанных с классом Dogs. Для этого мы определяем переменные внутри класса следующим образом:

class Dogs:
    legs = 4
    tail = 1
    ears = 2
    def bark(self):
        return "Wooof"
    def eat(self):
        return "Yum!"

Теперь, чтобы получить (без каламбура) эти атрибуты, мы можем ссылаться на переменную с помощью нашего экземпляра Ringo.

print(ringo.legs)
4

Теперь предположим, что мы начинаем бизнес по выгулу собак, начиная с трех собак, и мы хотим добавить к их экземпляру породу и вес каждой собаки. Мы делаем это, сначала создавая экземпляр для каждой собаки, а затем добавляя две переменные экземпляра для их соответствующей породы и веса:

riley = Dogs()
riley.breed = 'Golden Retriever'
riley.weight = '60lbs'
tony = Dogs()
tony.breed = 'German Shepherd'
tony.weight = '70lbs'
coconut = Dogs()
coconut.breed = 'Maltese'
coconut.weight = '10lbs'

Затем мы могли бы добавить всех этих собак в список, а затем вывести все названия пород в цикле for следующим образом:

all_dogs = [riley, tony, coconut]
for dog in all_dogs:
    print(dog.breed)
Golden Retriever
German Shepherd
Maltese
riley.bark()
'Wooof'

Как видите, экземплярам теперь присваиваются собственные уникальные характеристики вручную, при этом сохраняются методы экземпляра того класса, которому они были назначены.

Итак, вы можете увидеть, как ООП полезно при настройке чертежей для объектов, которые используют аналогичные функции, и как вы можете настроить их уникальные экземпляры на основе уникальных характеристик объекта. Я надеюсь, что это поможет пролить свет на эту основополагающую тему для всех, кто пытается понять или нуждается в повторении знаний по ООП.

Ваше здоровье