class A(object):
def a(self, b=1):
print 'Up'
d = {1 : a}
def b(self):
print self.d[1]
print self.b
print self.d[1].__get__(self, A)()
# print self.d[1]()
class B(object):
def a(self):
print 'here??'
return 10000
d = {1 : a}
def b(self):
print 'hurray'
o = A()
o.b()
b = B()
type(o).__dict__['b'].__get__(b, type(b))()
Привет народ,Binding метод другого класса
Я шел через Python: Bind an Unbound Method? и http://users.rcn.com/python/download/Descriptor.htm и пытается экспериментировать на мое обучение.
Но я ударил новые сомнения в настоящее время: -
- В последней строке моего кода, я могу использовать
__get__
сb
объекта и, например:type(b)
. Это работает только в том случае, если методb
определен вclass B
. Почему это так? - Несмотря на то, что последняя строка требует от меня указать метод
b
вclass B
, по-прежнему вызывается методb
вclass A
. Почему это так? - К моему полному удивлению, после вышеуказанного шага я замечаю, что метод
a
отclass A
не вызывается кодом методаb
изclass A
; вместо этого он вызывает методa
отclass B
. Почему это так?
Я довольно смущен, увидев это поведение. Мне также может понадобиться больше узнать о дескрипторах. Но, это было бы большим подспорьем, если вы могли бы ответить на мои сомнения
Спасибо, Кевин. Но, может ли вы объяснить, что может быть реальным примером, в котором мы могли бы использовать 'type (o) .__ dict __ ['b'] .__ get __ (b, type (b))()' вместо 'ob__get __ (b, type (b))() '? Другими словами, связывает метод 'b'' класса A' с классом B' когда-либо возможным? Если да, то как и каковы практические случаи использования? – GodMan
"связывает метод b класса A с классом B когда-либо возможным?" Это именно то, что вы делаете в своем коде. Получение 'self', чтобы притвориться, что это экземпляр A, является чем-то другим. В любом случае, я не думаю, что это практическое применение. Хороший код OO не должен пытаться «обмануть» среду, чтобы думать, что объект принадлежит классу, на котором он фактически не принадлежит. – Kevin
Спасибо, что ответили на все мои вопросы. – GodMan