Атрибут экземпляра объекта Python не совпадает с классом, но все же? [дубликат]Python

Программы на Python
Anonymous
Атрибут экземпляра объекта Python не совпадает с классом, но все же? [дубликат]

Сообщение Anonymous »

Этот вопрос касается метода id в Python и того, является ли метод класса одним и тем же экземпляром для самого объекта класса и любых экземпляров объекта, созданных из этого класса.
Пример кода:

Код: Выделить всё

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
В приведенном выше примере идентификаторы, выводимые вызовами id(p.name_as_upper) и id(p2.name_as_upper), идентичны, но идентификатор вызова (Person.name_as_upper) отличается.
Я ожидал, что все идентификаторы будут идентичными. Объект метода, на который ссылается имя Person.name_as_upper, отличается?
Я думал, что вызов метода экземпляра объекта был преобразован в вызов объекта метода, принадлежащего класс, то есть:

Код: Выделить всё

p.name_as_upper()
# Would be translated / equivalent to
Person.name_as_upper(p)
При повторном назначении Person.name_as_upper новому методу (лямбда-выражение в приведенном выше примере кода) это изменение также отображается в экземпляре p.
Таким образом, p.name_is_upper по-прежнему «то же самое», что и Person.name_as_upper.
Благодарен за любые разъяснения моего (недостаточного) понимания.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -but-still

Вернуться в «Python»