2009-11-21 15 views
6

İşte benim tahminim, hangi işe yaramıyor:Bir python temel sınıfı, bir alt sınıfın yöntemlerini geçersiz kıldığını nasıl anlayabilir?

class BaseClass(object): 
    def foo(self): 
     return 'foo' 
    def bar(self): 
     return 'bar' 
    def methods_implemented(self): 
     """This doesn't work...""" 
     overriden = [] 
     for method in ('foo', 'bar'): 
      this_method = getattr(self, method) 
      base_method = getattr(BaseClass, method) 
      if this_method is not base_method: 
       overriden.append(method) 
     return overriden 

class SubClass(BaseClass): 
    def foo(self): 
     return 'override foo' 

o = SubClass() 
o.methods_implemented() 

İdeal olarak, method_implemented() ['foo'] 'u iade ederdi.

Nasıl?

(Neden bunu yapmak isterdim? Temel sınıfım, GET, POST vb. yöntemleri olan bir HTTP Kaynak sınıfıdır. Varsayılan olarak, 405 Yöntemi Uygulanmadı. Ayrıca, 200 yanıt vermesi gereken bir yöntem SEÇENEKLERİ vardır. üstbilgiler ile Alt sınıfın uygulayacağı yöntemlere izin ver.)

+4

Bu neden bir topluluk vikisidir? –

+5

Bunu neden yapmak istediğinize emin değilsiniz. Herhangi bir sınıf hiyerarşisinde, bir temel sınıfın türetilmiş sınıflar hakkında bir şey bilmesi gerekmemelidir. Bu gerekliyse, ** belki ** tasarımınızın yeniden gözden geçirilmesi gerekir. – Steg

+4

Buna katılıyorum wiki olmamalı: çalışır ve kabul edilebilir bir cevap olacaktır. Ayrıca, bunu neden yapmak istediğiniz hakkında daha fazla şey duymak isterim, bunu yapmamanız gerekmiyordu, ama bu çözümlerden birinin, başka bir yerde daha iyi ve çok farklı bir çözümü olan bir soruna benzemesi nedeniyle. –

cevap

9

Belki bu?

>>> class BaseClass(object): 
...  def foo(self): 
...   return 'foo' 
...  def bar(self): 
...   return 'bar' 
...  def methods_implemented(self): 
...   """This does work.""" 
...   overriden = [] 
...   for method in ('foo', 'bar'): 
...    this_method = getattr(self, method) 
...    base_method = getattr(BaseClass, method) 
...    if this_method.__func__ is not base_method.__func__: 
...     overriden.append(method) 
...   return overriden 
... 
>>> class SubClass(BaseClass): 
...  def foo(self): 
...   return 'override foo' 
... 
>>> o = SubClass() 
>>> o.methods_implemented() 
['foo'] 

Bu, bağlı yöntemlerin arkasındaki işlev nesnelerinin aynı olup olmadığını denetler.

Not, Python 2.6'dan önce __func__ özniteliği im_func olarak adlandırılmıştır.

+0

Bu, benim python-2.5 yorumlayıcımda, __func__ değil im_func dosyasını kontrol etmeniz gerektiği istisnai olarak çalışır. Belki de cevabınızdan bahsedebilirsin. Teşekkürler. – Tenac

+1

Bir dahaki sefere bu gibi soruları "topluluk wiki" olarak işaretlemeyebilirsiniz. Yanıtlayanlar puanlarını almak ister! –

0

Yöntemler, aynı nesneyi çağırsalar bile, aynı nesne DEĞİLDİR. Bağlanmamış yöntemde sarılmış işlevlerin aynı nesne olup olmadığını sınamak için sınamanız gerekir.

Burada 2.6 kullanıyorum, bu yüzden nesneyi miras almak için sınıfı da değiştirdim.

>>> class BaseClass(object): 
...  def foo(self): 
...   return 'foo' 
...  def bar(self): 
...   return 'bar' 
...  def methods_implemented(self): 
...   """This doesn't work...""" 
...   overriden = [] 
...   for method in ('foo', 'bar'): 
...    this_method = getattr(self, method).__func__ 
...    base_method = getattr(BaseClass, method).__func__ 
...    if this_method is base_method: 
...     overriden.append(method) 
...   return overriden 
... 
>>> class SubClass(BaseClass): 
...  def foo(self): 
...   return 'override foo' 
... 
>>> o = SubClass() 
>>> o.methods_implemented() 
['bar'] 
İlgili konular