2016-08-25 3 views
-1

Я переопределяю функцию, но хочу получить функцию родителя из родительского.Получение функции родителя от родителя

>>> class a: 
...  def __init__(self): 
...    print(self.f) 
...  def f(self): 
...    pass 
... 
>>> class b(a): 
...  def __init__(self): 
...    super(b, self).__init__() 
...  def f(self): 
...    pass 
... 
>>> b() 
<bound method b.f of <__main__.b object at 0x000002E297A96160>> 

Я хочу распечатать, чтобы сказать a.f.

+2

Таким образом, мы можем избежать [XY] проблема (HTTP: // meta.stackexchange.com/questions/66377/what-is-the-xy-problem), что это * актуальная проблема, которую вы пытаетесь решить? Экземпляр 'b' * должен * сначала увидеть свою реализацию' f'. – jonrsharpe

+0

Я работаю над некоторым оптимизирующим кодом. Это * актуальная * проблема. –

+1

Это действительно добавлено больше информации. Если вы не хотите быть явным ('print (a.f)'), вы не можете. – jonrsharpe

ответ

1

Вы можете использовать name mangling сделать self.__f см A.__f внутри определения класса A «s.

Имя коверкание полезно для позволяя подклассы переопределить методы, не нарушая внутригрупповой вызовов метода

class A: 

    def __init__(self): 
     self.__f() 

    def f(self): 
     print('A.f') 

    __f = f # Private copy of A's `f` method 

class B(A): 

    def __init__(self): 
     super(B, self).__init__() 

    def f(self): 
     print('B.f') 

b = B() 
b.f() 

печатает

A.f 
B.f 
-1
class a(object): 
    def __init__(self): 
     pass 

    def f(self): 
     print 'Parent Method...' 

class b(a): 
    def __init__(self): 
     super(b, self).__init__() 
     a.f(self) #referance the parent class rather than the child class, because the child overrides the parent method. 
     self.f() 

    def f(self): 
     print "Childs Method..." 


b() 
+0

Как говорится в вопросах, «от родителя». Вы вызываете 'a.f' из дочернего класса' b'. –

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