Кажется, вы упрощаете не очень простую вещь.
В объектно-ориентированном программировании класс представляет собой декларативную конструкцию, которая дает представление о том, что объект (проявление этого проекта) будет содержать (свойства) и как он будет вести себя (члены).
Каждое проявление такого Класса называется Объектом, который имеет определенный и конкретный экземпляр. От объекта через любой из этих поведенческих атрибутов, называемых функциями / методами-членами, нам нужно как-то сослаться на этот экземпляр объекта и запомнить отдельные элементы внутри него и провести четкое различие с другими объектами, не являющимися членами.
Рассмотрим Ваш пример
class Person:
def __init__(self, name):
self.name = name
def sayHi(self):
print 'Hello, my name is', self.name
Каждый экземпляр этого персонажа (Том, Дик, Гарри) уникален, и в каждом экземпляре для обращения к самому себе нам нужна некоторая идиома, например (self в Python, это ptr C ++ или это в Java).
Таким образом, в методе __init__
, когда вам нужно разграничить атрибут name
объекта Person с параметром name
, мы легко можем сделать это с помощью self
. Мало того, что в любом случае мы можем продолжать ссылаться на это имя через self
.
Создание экземпляра Person p=Person('Swaroop')
с последующим вызовом sayHi в отличие от вызова просто функции sayHi, которая не является частью объекта, имеет два значения
- Функция временная, не имеет состояния, никакого экземпляра, и это как сказать этому парню: «Эй, мистер, кто бы вы ни говорили,« Здравствуйте, меня зовут Swaroop »». Это как при каждом пробежке вы должны заставить дурака узнать его имя, который забудет в следующий момент, когда вы встретите его. Как будто этот парень страдает от Anterograde_amnesia . С другой стороны, вызов
sayHi
экземпляра Person по имени Swaroop будет означать что-то вроде физически существующего Swaroop, приветствующего его Имя, которое имеет постоянную память и никогда не забудет, если не примет новое имя.
- Функция никогда не запоминает, а забывает каждый раз, когда заканчивается вызов. Объект Person будет помнить имя до тех пор, пока вы явно или неявно не убьете этого человека.
Если у вас есть опыт работы с C ++ и вам может быть интересно, зачем вообще нужно добавлять этот дополнительный параметр в вызов функции, где, как и в C ++, этот указатель никогда не передается.
Ну, откровенно говоря, это так. Если вы читаете соглашение о вызовах C ++, будь то X86 или X64, указатель this передается в регистр ecx
методу, чтобы получить дескриптор самого себя. Это более очевидно здесь, где мы сознательно передаем дескриптор текущего экземпляра методу.