2017-10-19 50 views
0

J'ai une classe comme ci-dessousComment obtenir les noms de propriété de super-classe dans la sous classe python

class Paginator(object): 
    @cached_property 
    def count(self): 
     some_implementation 

class CachingPaginator(Paginator): 
    def _get_count(self): 
     if self._count is None: 
      try: 
       key = "admin:{0}:count".format(hash(self.object_list.query.__str__())) 
       self._count = cache.get(key, -1) 
       if self._count == -1: 
        self._count = self.count # Here, I want to get count property in the super-class, this is giving me -1 which is wrong 
        cache.set(key, self._count, 3600) 
      except: 
       self._count = len(self.object_list) 
    count = property(_get_count) 

Comme indiqué dans le commentaire ci-dessus, self._count = <expression> devrait obtenir la propriété de comptage en super-classe. Si c'est la méthode, nous pouvons l'appeler comme ceci super(CachingPaginator,self).count() AFAIK. J'ai référé de nombreuses questions à SO, mais rien de tout cela ne m'a aidé. Quelqu'un peut-il m'aider dans ce domaine.

+1

Et avez-vous essayé 'super (CachingPaginator, auto) .count'? –

+0

Ou, si vous êtes sur python 3: 'super(). Count' –

+0

@TheBrewmaster Je suis sur python 2.7 mate ... –

Répondre

0

Les propriétés sont juste des attributs de classe. Pour obtenir l'attribut de classe d'un parent, vous utilisez la recherche directe sur la classe parent (Paginator.count) ou un appel super(). Maintenant, dans ce cas si vous utilisez recherche directe sur la classe parente, vous devrez invoquer le protocole descripteur manuellement, ce qui est un peu bavard, donc en utilisant super() est la solution la plus simple:

class Paginator(object): 
    @property 
    def count(self): 
     print "in Paginator.count" 
     return 42 

class CachingPaginator(Paginator): 
    def __init__(self): 
     self._count = None 

    def _get_count(self): 
     if self._count is None: 
      self._count = super(CachingPaginator, self).count 
     # Here, I want to get count property in the super-class, this is giving me -1 which is wrong 
     return self._count 
    count = property(_get_count) 

Si vous voulez un recherche de classe parente directe, remplacer:

self._count = super(CachingPaginator, self).count 

avec

self._count = Paginator.count.__get__(self, type(self))