Пример кода:
Код: Выделить всё
class Person:
def __init__(self, name: str) -> None:
self.name = name
def name_as_upper(self) -> str:
return self.name.upper()
p = Person("john")
p2 = Person("sarah")
print(
id(p.name_as_upper), id(p2.name_as_upper), id(Person.name_as_upper)
) # first two are the same, last one different
print(p.name_as_upper()) # JOHN
print(Person.name_as_upper(p)) # JOHN
Person.name_as_upper = (
lambda self: self.name.upper() + " - suffix"
) # "point" name_as_upper method object to different method
print(p.name_as_upper()) # JOHN - suffix
print(Person.name_as_upper(p)) # JOHN - suffix
Я ожидал, что все идентификаторы будут идентичными. Объект метода, на который ссылается имя Person.name_as_upper, отличается?
Я думал, что вызов метода экземпляра объекта был преобразован в вызов объекта метода, принадлежащего класс, то есть:
Код: Выделить всё
p.name_as_upper()
# Would be translated / equivalent to
Person.name_as_upper(p)
Таким образом, p.name_is_upper по-прежнему «то же самое», что и Person.name_as_upper.
Благодарен за любые разъяснения моего (недостаточного) понимания.
Подробнее здесь: https://stackoverflow.com/questions/787 ... -but-still