Это помогает увидеть, что на самом деле оценивает self.pressed
.
Экземпляр self
не имеет атрибута с именем pressed
. Его класс, MyGrid
, имеет function
-значный атрибут с тем же именем.
Таким образом, self.pressed
оценивается как MyGrid.pressed
. Но поскольку класс function
реализует протокол дескриптора, вы не получите ссылку на этот объект function
. Вместо этого вы получите результат MyGrid.pressed.__get__(self, MyGrid)
. И , что возвращает вызываемый объект типа method
. Этот объект при вызове будет принимать любые аргументы, которые он получит, и сразу же передаст self
, а эти аргументы вызову MyGrid.pressed
.
Короче говоря, значение self.pressed
очень похоже на функцию которые могли быть определены как
def bound_method(*args, **kwargs):
return MyGrid.pressed(self, *args, **kwargs)
self.pressed == MyGrid.pressed
== MyGrid.__dict__['pressed'].__get__(self, MyGrid)
и когда в конечном итоге вызывается self.pressed
,
self.pressed(ins) == MyGrid.__dict_['pressed'].__get(self, MyGrid)(self, ins)