2016-04-24 3 views
-2

Скажем, у меня есть два файла: file1.py и file2.py. В file1.py, я определяю два класса, один наследует от другого:Метод переопределения класса в другом файле

file1.py:

class Class1: 
    def __init__(self): 
     pass 

    def func1(self): 
     return "Hello world!" 

class Class2(Class1): 
    def __init__(self): 
     pass 

    def func2(self): 
     return self.func1() 

Так что теперь я могу назвать func1() и func2() от Class2.

file2.py:

import file1 

class Class3(file1.Class2): 
    def __init__(self): 
     pass 

Вопрос: Как я могу изменить func1() от Class1 в file2.py, так что func2() в Class2 возвращается такой же, как func1()?

Так что не нравится:

class Class3(file1.Class2): 
    ... 
    def func1(self): 
     return "Another string" 
+2

Не совсем понятно, что вы хотите, но это звучит как 'Class3' не следует наследовать от класса Class2, если просто переопределить' Class3.func2() 'не является решением. – chepner

+0

@chepner Это немного сложно, выше всего лишь скелет класса в стандартной библиотеке Python (определенный в файле file1.py). file2.py - это мой собственный файл, я не хочу менять код в файле в пакетах сайта! – linusg

ответ

1

перекрывая бы func1 работу?

class Class(file1.Class2): 
    def func1(self): 
     print "Class3.func1" 

c = Class3() 
c.func2() 

Поскольку func2 не определен в Class3, Class2.func2 называется. Однако в теле этой функции self по-прежнему является экземпляром Class3, поэтому self.func1() вызывает Class3.func1, а не Class1.func1. Это отличается от

d = Class2() 
d.func2() 

, где self в Class2.func2 является экземпляром Class2. Class2 не определяет func1, поэтому Class1.func1 называется.

+0

Эй, спасибо большое, что работает! Я не думал об этом, но в то время как 'func1()' не определен в 'Class3', это кажется прекрасным решением. Я использовал это для переопределения функции из класса 'FTP' в модуле' ftplib' в моем классе, который наследует от 'FTP_TLS', который наследует от' FTP' ... :) – linusg

0

Я думаю, вы хотите monkeypatch Class1.func1.

c2 = Class2() 
print(c2.func2()) 
Hello world! 

def new_func1(self): 
    return "Another string" 

Class1.func1 = new_func1 # This is monkey patching. 

print(c2.func2()) 
Another string 

Но это может нарушить другой код, который использует Class1 или Class2.

+0

Это изменяет поведение всех классов с помощью класса Class1 'как предок, а не только' Class3'. – chepner

+0

Спасибо, но я не могу заставить это работать с классами ftplib ... – linusg

+0

@chepner Я знаю, следовательно, бит «это может сломать». Мне кажется, это именно то, о чем просит OP: «Как я могу изменить func1() из Class1 в файле2.py ...», но, как вы сказали, не совсем ясно, чего они хотят. – Goyo

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