Почему, если метод класса - дескриптор только на чтение (т.е. у него есть __get__, но нет __set__) я не могу изменить его?
Т.е. если сделать:
print(dir(Cls.my_meth))
там будет __get__, но заменить его никак нельзя. Т.е. код:
test_class_instance.my_method() #первая
TestCls.my_meth.__get__(test_class_instance, TestCls)()#вторая
И первая и вторая строка, по сути, вроде как равнозначны?
Но запись вида:
class TestCls:
def __init__(self):
self.val = 5
def my_meth(self):
print(f"my_meth.called({self.val})")
def custom_get(*params):
print(f"my_func_get({params})")
setattr(TestCls.my_meth, "__get__", custom_get)
created_cls = TestCls()
created_cls.my_meth() # нет вызова __get__ (custom_get)
Не вызывает custom_get(...), просто добавляя его в __dict__ метода.