2015-08-11 4 views
0

У меня проблема. Вы видите, что я хочу сделать то же самое, как это Java-код:Абстрактные методы как в Java

new Runnable() { 

//run() is a method that you need to 
//implement when you create any 
//new instance of Runnable 
public void run() { 
//Code goes here 
} 
} 

где Java есть вы реализовать абстрактные методы, как с Runnable. Дело в том, что я пытаюсь воспроизвести одно и то же в Python, передав аргумент в методе init класса, а затем сохраните этот метод как переменную в классе (self.method) , где я запускаю этот метод в какой-то момент позже в коде этого класса. Дело в том, должны быть приняты все аргументы метода при создании класса, не тогда, когда вызывается метод, который, когда я хочу передать аргументы:

class AbstractExample(): 

    def __init__(self, method): 
     method #Run method 

def exampleMethod(arg1,arg2): 
    print str(arg1) + "," + str(arg2) 

AbstractExample(exampleMethod(5,7)) 

Выход: «5 , 7 ", и если я не передаю аргументы, когда класс создается, как указано выше, я получаю сообщение об ошибке. Мой вопрос в том, есть ли способ, которым я могу сделать Java-код выше по-другому?

+1

1. Там часто мало смысла в репликации бессмысленные вещи Java в Python. 2. Вы отправляете результат вызова функции, а не самой функции, в 'AbstractExample'. 3. Можете ли вы сказать нам, какой результат вы пытаетесь выполнить, а не странности Java, которую вы пытаетесь воспроизвести, чтобы получить этот результат? – TigerhawkT3

+0

@ TigerhawkT3 ОК, так что в общем, у меня есть эта штука с сокетами, и я хочу создать событие, если вы когда-нибудь получите. Я в основном создал протокол для отправки простых пакетов между сервером и клиентом, и люди могли использовать его в качестве библиотеки, поэтому я хочу, чтобы они могли что-то делать с пакетом при его получении. (Пример: сканирование пакета для конкретных данных), поэтому я хочу событие, в котором пользователь/программист имеет доступ к полученному пакету –

+0

Если вы не читали [этот учебник] (http://pymotw.com/2/abc /) на абстрактных базовых классах – Pynchia

ответ

0

Python не имеет абстрактных классов, подобных Java. Вы можете передавать вызовы в качестве значений аргументов функции.

class AbstractExample(): 

    def __init__(self, arg1, arg2): 
     self.arg1 = arg1 
     self.arg2 = arg2 

    def call_now_with_my_parameters(self, callable): 
     callable(self.arg2, self.arg2) 

def example_function(arg1,arg2): 
    print("{},{}".format(arg1, arg2)) 

ae = AbstractExample(5, 7) 
ae.call_now_with_my_parameters(example_function) 

Мне кажется, что вы хотите сохранить вызываемый и его аргументы для последующего исполнения. Здесь с частичным:

from functools import partial 
p = partial(print, 'aef','qwe') 
p() 
em = partial(exampleMethod, 5, 6) 
em() 

Вы можете затем передать р и Em переменные как параметры функции.

Может быть, это то, что вы намерены делать:

from functools import partial 


class AbstractExample(): 

    def __init__(self, callable): 
     callable() # call it now 

def example_function(arg1,arg2): 
    print("{},{}".format(arg1, arg2)) 

call_this_later = partial(example_function) 
// you can pass call_this_later as parameter 
ae = AbstractExample(call_this_later(5, 7)) 
+0

Главное, чтобы, если вы прочитали мой ответ на комментарий TigerhawkT3s выше, аргументы, которые входят в метод, который я передаю в качестве аргумента в моем классе, определяются позже в коде. в основном, когда я вызываю метод в init класса (callable()), я хочу передать аргументы. Я хочу сделать callable (5,7), но это порождает ошибку, потому что Python требует, чтобы вы уже определили аргументы при передаче метода в качестве аргумента в методе init классов. Мне интересно, как я мог обойти это –

+0

Не обращайте внимания на частичный модуль, который полностью решает мою проблему! –

+0

OK. Рад, что вы это решили. –

0

Во-первых, для запуска method, вы должны использовать method().

Кроме того, вы выполняете exampleMethod перед передачей его AbstractExample. Вы можете сделать это, вместо этого:

class AbstractExample(): 

    def __init__(self, method): 
     method() #Run method 

def exampleMethod(arg1,arg2): 
    print str(arg1) + "," + str(arg2) 

AbstractExample(lambda: exampleMethod(5,7)) 
Смежные вопросы