2015-08-31 4 views
0

У меня есть ссылка на функцию, которая вызывается объектом. Я бы хотел, чтобы этот объект передал себя как параметр функции, как это обычно делается для его собственных функций.python pass self to referenced function

IE Я хотел бы использовать self.myFoo() вместо self.myFoo (само) в следующем примере

Пример кода:

def foo(self): 
    print(self.toString()) 

class Node: 
    def __init__(self, myFoo): 
     self.myFoo = myFoo 

    def run(self): 
     self.myFoo() 

    def toString(self): 
     return "Hello World" 

n = Node(foo) 
n.run() 
+0

Почему вы пытаетесь избежать 'self.myFoo (self)'? – bmhkim

+0

Ничего, в основном просто любопытно, почему self.myFoo() не работает; также, если я могу заставить его работать – Alter

+0

'self' в' def foo (self) 'вводит в заблуждение. Я не думаю, что этот код работает. –

ответ

3

Проблема в том, что вы назначили myFoo несвязанной функции и называете ее так, как если бы она была связана. Если вы хотите использовать self.myFoo(), вам нужно будет каррировать объект в первый аргумент самостоятельно.

from functools import partial 

def foo(self): 
    print(self.toString()) 

class Node: 
    def __init__(self, myFoo): 
     self.myFoo = partial(myFoo, self) 

    def run(self): 
     self.myFoo() 

    def toString(self): 
     return "Hello World" 

n = Node(foo) 
n.run() 

В качестве альтернативы можно использовать

self.myFoo = types.MethodType(myFoo, self) 

в методе __init__(self, myFoo), но с использованием частичного чаще делается, и более универсальным, так как вы можете использовать его, чтобы снискать аргументы для любого вида функции, а не только методы.

+0

Хороший, забыл о 'partial'. – HelloWorld

+0

Это круто, я не знал о 'partial'. Благодаря! – bmhkim

+0

Не знал, что вы можете это сделать. Neato! Это просто дало мне GEB Déjà vu. –

1

foo является простой функцией. Чтобы сделать его вызываемым через self.myFoo(), вы можете прикрепить его к классу, а не к объекту. Даже Node.myFoo по-прежнему является несвязанной функцией, которую вы можете вызвать через self.myFoo() в своем классе.

def __init__(self, myFoo): 
    Node.myFoo = myFoo 
2

This thread похоже, что вы ищете. Чтобы связать метод с объектом (но не его классом) во время выполнения, вы можете:

import types 
n.foo = types.MethodType(foo, n) 
+0

kudoos для этого, Если бы я мог выбрать два ответа, я бы принял ваш тоже – Alter