2016-06-04 6 views
0

У меня есть немного дилемма, где в fileB Мне нужно позвонить классу classC, но прежде чем я это сделаю, мне нужно перезаписать functionA. Я не уверен, как это сделать. спасибо за любую помощь заранее!Как переписать метод в python?

#fileA 

class classA(): 
    def functionA(): 
     print('Hello World!') 


class classB(classA): 
    pass 

class classC(classB): 
    pass 


#fileB 

from fileA import classC 
#overwrite functionA 
classC() 
+0

Я не уверен, чего вы пытаетесь достичь. Вы можете использовать тот же синтаксис в 'fileB', чтобы переопределить' classC', как вы это делали в 'fileA'. Есть ли какой-то метод, который вы динамически определяете в 'fileB'? – rmorshea

ответ

3

«Правильный» способ сделать то, что вы хотите, чтобы переопределить метод, чтобы не перезаписать его. Вы делаете это, создавая подкласс класса и предоставляя новое определение для одного или нескольких своих методов.

Прежде всего, хотя есть ошибка в определении classA.functionA() - вам нужно включить self аргумент:

class classA: 
    def functionA(self): 
     print('Hello World!') 

С этим исправил то вам необходимо определить новый подкласс classC в fileB.py, отменяющий functionA():

from fileA import classC 

class classD(classC): 
    def functionA(self): 
     print('classD.functionA(): Hello World!') 

>>> c = classC() 
>>> c.functionA() 
Hello World! 

>>> d = classD() 
>>> d.functionA() 
classD.functionA(): Hello World! 

стоит отметить, что классы classB и classC показаться бессмысленным, учитывая, что (как показано), они не вносят изменений в базовый класс A. Таким образом, вы можете напрямую подкласса classA.

Это самый базовый объектно-ориентированный дизайн/программирование, поэтому я предлагаю вам посмотреть учебник или два.

Как я сказал выше, это правильный способ сделать это. Кроме того, можно заменить/переписать метод следующим образом:

from fileA import classC 

def my_function_A(self): 
    print('my_function_A(): Hello World!') 

>>> c = classC() 
>>> c.functionA() 
Hello World! 

>>> classC.functionA = my_function_A # overwrite the method 
>>> classC().functionA() 
my_function_A(): Hello World! 
>>> c.functionA() 
my_function_A(): Hello World! 

Но наиважнейшая предпочтительнее перезаписи. Одна из проблем заключается в том, что если вы перезапишете этот метод, все предыдущие экземпляры classC также будут затронуты, как показано в последней строке вышеприведенного кода.

+0

Быстрая заметка для вашего заключительного утверждения: вы также можете создать экземпляр класса C, а затем переписать только этот экземпляр my_function_A. Это оставит класс C совершенно незатронутым. –

+0

@JoelHarmon: да, это правда, однако, я пытался продемонстрировать, что исправление обезьян может иметь непреднамеренные побочные эффекты. – mhawke

+0

Я согласен, что это может вызвать проблемы (а также обеспечить преимущества, как и любые другие компромиссы). Тем не менее, поскольку вы подняли monkeypatching в своем ответе, я думаю, что лучше предоставить более полное/точное представление об этом. Как написано, последнее предложение применяется только к одному использованию monkeypatching, и, следовательно, я считаю его вводящим в заблуждение. –

0

Название техники, которую вы ищете, является monkeypatching.

Функции в Python являются первоклассными объектами. Таким образом, вы можете просто назначить их классу или объекту. Это означает, что вы можете иметь два объекта, которые являются экземплярами одного и того же класса, которые вызывают два разных метода, даже если вызывается одно и то же имя. Их даже не нужно определять с тем же именем или даже с любым именем; Я смотрю на тебя, Лямбда.