Есть ли третий такой метод как self и other которые ссылаются на атрибуты класса?

Недавно начал изучать ООП в Пайтоне и узнал о таких вещах как self и other и мне стало интересно, а что если параметров будет больше чем 2, что тогда? Есть ли третий такой метод как self и other, которые ссылаются на атрибуты класса??


Ответы (2 шт):

Автор решения: Sergey K.

Любая функция или метод могут принимать любое необходимое количество параметров с любым именем. Метод - это функция, принадлежащая классу. self именуют первый параметр метода, который даёт нам способ обращаться к атрибутам этого класса в момент, когда экземпляр класса уже создан. Параметры можете называть как угодно.

Вот пример, здесь конструктор (функция __init__) принимает 5 параметров, 4 из которых дополнительные, требующиеся для класса. Так же есть несколько примеров функций. Одна из них - change_name служит для смены имени человека (экземпляра класса Person), и принимает 3 параметра - self и 2 других, которые нужны для логики этой функции first_name и last_name

class Person:
    def __init__(self, name, last_name, age, born_date):
        self.name = name
        self.last_name = last_name
        self.age = age
        # Формат даты рождения dd.mm.yyyy
        self.born_date = born_date

    def get_fullname(self):
        return f'{self.last_name} {self.name}'

    def get_born_year(self):
        # делит строку по точке и возвращает последнюю часть строки, т.е. год из даты
        return self.born_date.split('.')[-1]
    
    def change_name(self, first_name, last_name):
        self.name = first_name
        self.last_name


person = Person('Александр', 'Чёрный', '34', '12.02.1988')
print(person.get_fullname())
print(person.get_born_year())
person.change_name('Василий', 'Дятлов')
print(person.get_fullname())
→ Ссылка
Автор решения: MarianD

Имена self и other ни что другое, как конвенция — вы можете применить какие вам угодны. (Хотя я вам это не рекомендую, когда хотите, чтобы другие программисты не имели трудности с пониманием вашего кода.)

  • self значит я, в смысле «я, текущий объект».
  • other значит другой, в смысле «другой операнд (после применения метода к первому)».

Например

def __add__(self, other)
    return self.val + other.val

то же самое, как

def __add__(x, y)
    return x.val + y.val

(В этом примере я предполагаю, что объекты этого класса имеют свойство val.)

  a   +   b        оператор «+» определен методом:  def __add__(self, other):
  ^       ^                                             return self.val + other.val
self    other 

Примечание:

a + b по определению только сокращенная (инфиксная) запись для а.__add__(b).

В записи а.__add__(b) лучше видно, почему имена self и other:

  • a принято называть self (я, ко мне применяют метод .__add__())

  • b принято называть other (параметром метода .__add__() является другой операнд).

Вы можете попробовать это (и с другими операторами-методами):

>>> (7).__add__(3)             # то же самое как 7 + 3
10

>>> (7).__mul__(3)             # то же самое как 7 * 3
21

>>> (7).__sub__(3)             # то же самое как 7 - 3
4

Целое число 7 должно быть в скобках только из-за синтаксических причин — иначе бы точка прямо за 7 интерпретировалась как десятичное число 7. (уже не типа int, а типа float) и нужно бы было поставить еще одну точку:

>>> 7..__add__(3)              # то же самое как 7.+ 3
10.0
→ Ссылка