2010-08-03 2 views
2

Вот примерPython свойство и метод коррекции вопрос: почему подкласс свойство все еще вызывает метод базового класса

class A(object): 
     def f1(self): 
       return [] 
     test1 = property(f1) 


class B(A): 
     def f1(self): 
       return [1, 2] 

if __name__ == "__main__": 
     b = B() 
     print b.test1 

Я ожидаю, что выход будет [1, 2], но он печатает [] вместо этого.

Это противоречит моим ожиданиям.

Произошла ошибка в коде? Если нет, я полагаю, что это работает так, потому что, когда свойство test1 создано, оно связано с функцией f1 базового класса A. Какая возможная альтернативная реализация для достижения того, что я хочу?

+0

Кстати, почему CW для совершенно технического вопроса восприимчивого к резким и одинаково техническим ответам ?! Я ответил, прежде чем определить тег CW, однако я ненавижу и обычно избегаю вопросов, которые неправильно маркируются (CW, когда они, очевидно, не должны быть, или наоборот). –

ответ

6

Вы можете отложить поиск в f1 с лямбдой-функцией, если вы не хотите загрязнять имена класса

class A(object): 

     def f1(self): 
       return [] 

     test1 = property(lambda x:x.f1()) 
3

Я предполагаю, что это работает так, потому что при создании test1 собственности, он связан с функцией f1 классовой базы А.

точно.

Что такое альтернативная альтернатива Реализация для достижения того, что я хочу?

еще один уровень косвенности:

class A(object): 
    def f1(self): return [] 
    def _f1(self): return self.f1() 
    test1 = property(_f1) 

class B(A): 
    def f1(self): return [1, 2] 
1

Несколько вариантов я могу думать: либо повторить вызов property в подклассе

class B(A): 
    def f1(self): 
     return [1,2] 
    test1 = property(f1) 

или основание собственности на другой метод, который вызывает f1:

class A(object): 
    def f1(self): 
     return [] 
    def _f1(self): 
     return self.f1() 
    test1 = property(_f1) 
Смежные вопросы