Есть ли третий такой метод как self и other которые ссылаются на атрибуты класса?
Недавно начал изучать ООП в Пайтоне и узнал о таких вещах как self и other и мне стало интересно, а что если параметров будет больше чем 2, что тогда? Есть ли третий такой метод как self и other, которые ссылаются на атрибуты класса??
Ответы (2 шт):
Любая функция или метод могут принимать любое необходимое количество параметров с любым именем. Метод - это функция, принадлежащая классу. 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())
Имена 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