2015-06-01 1 views
4

Я пытаюсь расширить рамки, у меня есть что-то вроде этого:Python супер переопределить имя объекта

class A(object): 
    def test(self): 
     print(1) 


class B(object): 
    def method(self): 
     a = A() 
     a.test() 


class CustomA(A): 
    def test(self): 
     print(2) 


class C(B): 

    def method(self): 
     A = CustomA 
     super(C, self).method() 

c = C() 
c.method() 

классов А и В из рамок.

Я хочу отредактировать этот тест() от A и сделать C использовать этот новый метод.

В этом коде, например, как я могу сделать свой код print 2 вместо 1?

[Update]

Это был лишь простой пример. Я хочу продлить this class. Таким образом, вместо того, чтобы создать SettingsPanel, создать CustomSettingsPanel

Но проблема в том, что мне нужно сделать это с большим количеством классов, так что я просто хочу способ сделать питона всегда использовать CustomSettingsPanel и не SettingsPanel.

ответ

0

Существует множество способов решения этой проблемы.

Если вы можете редактировать B, то вы могли бы реорганизовать его так, что вместо жесткой зависимости от A, которые он принимает параметр в ___init___, чтобы указать один класс для создания экземпляра. Что-то вроде:

class B(object): 
    def __init___(self, clazz=A): 
     self.__clazz = clazz 
    def method(self): 
     a = self.__clazz() 
     a.test() 

class C(B): 
    def __init__(self): 
     super(C, self).__init__(CustomA) 

Если вы не можете редактировать B, то я бы предложил оборачивать его в адаптер, есть код взаимодействовать через этот класс (а не B или C), а затем управлять сложностью A против CustomA выбора есть в адаптере с помощью параметра флага:

class ABCAdapter(object): 
    USE_CLASS_A = 0 
    USE_CLASS_CUSTOMA = 1 

    def __init__(self, test_class=USE_CLASS_A): 
     if test_class = USE_CLASS_A: 
      self.a_instance = A() 
     elif test_class = USE_CLASS_CUSTOMA: 
      self.a_instance = CustomA() 

    def method(self): 
     self.a_instance.test() 

Может также изучить другие объектны порождающие паттерны (заводы, и т.д.). Все зависит от ваших ограничений и того, что вы пытаетесь выполнить.

1

Вам не нужно называть super in C. Вы пытаетесь переопределить метод B.

class A(object): 
    def test(self): 
     print(1) 


class B(object): 
    def method(self): 
     a = A() 
     a.test() 


class CustomA(A): 
    def test(self): 
     print(2) 


class C(B): 
    def method(self): 
     A = CustomA() 
     A.test() 

c = C() 
c.method() 
+0

Это был просто простой пример. Я хочу расширить [этот класс] (https://github.com/kivy/kivy/blob/master/kivy/uix/settings.py#L962). Поэтому вместо создания 'SettingsPanel', создайте' CustomSettingsPanel' –

+0

Но проблема в том, что мне нужно будет делать это с большим количеством классов, поэтому я просто хочу, чтобы python всегда использовал 'CustomSettingsPanel', а не' SettingsPanel'. –

+1

Почему вы не можете просто сделать 'CustomSettingsPanel', а затем реорганизовать свой код, чтобы использовать это вместо' SettingsPanel'? –