2014-11-14 1 views
2

Я знаю, что с классами Python вы можете наследовать от других классов, как это:Является ли наследование функциями в Python?

class A(object): 
    pass 

class B(A): 
    pass 

Однако, это возможно с функциями? Например, в файле Fab у меня в настоящее время есть две функции, которые выполняют одни и те же вещи. Мне нужна базовая функция, поэтому я могу остановить дублирование настроек.

Например:

def environment_base(): 
    #settings for both environment1 and environment2 here 

def environment1(): 
    pass 

def environment1(): 
    pass 

Я знаю, это то, что классы для но ткань не дает мне возможность использовать классы для настройки.

Это мой фактический прецедент. У меня есть ткань файл, который имеет две среды i..e fab environment1 command или fab environment2 command

def environment1(): 
    settings = get_settings(local_path) 
    env.git_key = settings['GIT_KEY'] 
    env.hosts = get_hosts_list(local_path) 

def environment1(): 
    settings = get_settings(local_path) 
    env.hosts = get_hosts_list(local_path) 

Как вы можете видеть обе функции имеют некоторые из тех же самых условиях и не отвечает «Не повторяйте себе» принцип.

+0

Вы должны явно вызвать 'environment_base'. Насколько я знаю, то, что вы описываете, не существует ни на одном языке на основе OO (или даже в теории OO). –

+2

Без более конкретного примера трудно дать совет. Обратите внимание, что, хотя вы не можете выполнять функции «подкласса», но вы можете создавать классы '__call__'able. – jonrsharpe

ответ

6

Это то, что вы используете магию decorators для:

def p_decorate(func): 
    def func_wrapper(name): 
     return "<p>{0}</p>".format(func(name)) 
    return func_wrapper 

@p_decorate 
def get_text(name): 
    return "lorem ipsum, {0} dolor sit amet".format(name) 

print get_text("John") 

# Outputs <p>lorem ipsum, John dolor sit amet</p> 
+0

Будет ли это также возможно инициализировать материал или только на возвращаемое значение? –

+0

Есть много примеров - попробуйте пример декораторов python Google –

+0

@SteveBarnes теперь я знаю, что они называются Я буду :) – Prometheus

1

Нет, это невозможно в Python (или любом другом языке OO, о котором я знаю).

Вы должны явно вызывать environment_base:

def environment_base(): 
    #settings for both environment1 and environment2 here 

def environment1(): 
    environment_base() 
    pass 

def environment1(): 
    environment_base() 
    pass 
+0

Явным образом вызываю функцию, позволю мне перезаписать настройки? – Prometheus

+0

@Sputnik Я действительно не мог сказать, не зная, как вы пишете свои настройки. –

2

Может быть, я совершенно не понял ваш вопрос, но почему бы не просто вызовом функции «базовой» от остальных?

def environment_base(): 
    # do basic things 
    # ... 

def environment1(): 
    environment_base() 
    # do env1-specific stuff 

def environment2(): 
    environment_base() 
    # do env2-specific stuff 
+0

Это точно, что я сказал. –

+0

@BartFriederichs: ... ну, великие мысли думают одинаково :-) Обратите внимание, что мы представили наши ответы в одно и то же время (9:52), я не видел ваших, и вы не видели моих. Нужно быстро набирать SO. И давайте не будем начинать приоритетный судебный процесс :-) Кстати, наше решение намного яснее, чем волшебство ИМХО Стива Барнса. –

Смежные вопросы