Drodzy python 3 ekspertów,python2 vs funkcji python3 do sposobu wiązania
z python2, można wykonać następujące czynności (wiem, że to jest nieco owłosione, ale nie o to tu chodzi: P):
class A(object):
def method(self, other):
print self, other
class B(object): pass
B.method = types.MethodType(A().method, None, B)
B.method() # print both A and B instances
z python3, nie ma więcej niezwiązanych metod, tylko funkcje. Jeśli chcę to samo zachowanie, to brzmi jak mam przedstawić własny deskryptor takich jak:
class UnboundMethod:
"""unbound method wrapper necessary for python3 where we can't turn
arbitrary object into a method (no more unbound method and only function
are turned automatically to method when accessed through an instance)
"""
def __init__(self, callable):
self.callable = callable
def __get__(self, instance, objtype):
if instance is None:
return self.callable
return types.MethodType(self.callable, instance)
więc mogę zrobić:
B.method = UnboundMethodType(A().method)
B.method() # print both A and B instances
Czy jest jakiś inny sposób to zrobić bez pisemnej taki deskryptor?
TIA
Szybki, nietypowy komentarz: Nie trzeba wyprowadzać z obiektu w Py3. Zawsze odbywa się to w sposób dorozumiany. Aby to sprawdzić, po prostu 'print (anyobject .__ mro __)' (= metoda Rozdzielczość metody) – cfi
Wierzę, że jest to duplikacja [http://stackoverflow.com/questions/10729909/convert-builtin-function-type-to-method -type-w-python-3]. Jednak to pytanie jest prawdopodobnie łatwiejsze do znalezienia. Również jest bardziej jasne (przynajmniej dla mnie), więc chciałbym głosować, aby zachować ten ... – cfi
@ cfi, prawda o dziedziczeniu obiektów, naprawiono UnboundMethod code sample. Również masz rację, że jest to podobne pytanie, jak w przypadku wiązania skompilowanej/wbudowanej funkcji (która nie ma satysfakcjonującej odpowiedzi btw). – sthenault