2016-04-28 1 views
0

J'ai une grande classe qui a beaucoup de fonctions et d'attributs. les instances sont créées à partir de données dans une base de données distante.Python: utilise une méthode de classe comme statique, quand elle est implémentée comme méthode d'instance

Le processus de création de chaque instance est très long et lourd.

En performance sake ive a créé une classe de grappes de cette classe lourde. donc l'accès à l'attribut est facile et fonctionne très bien. le problème est de savoir comment utiliser les méthodes de cette classe.

ex:

class clsA(): 
    def __init__(self,obj): 
     self.attrA=obj.attrA 
    def someFunc(self): 
     print self 
class bunchClsA(bunch): 
    def __getattr__(self, attr): 
     # this is the problem: 
     try: 
      #try and return a func 
      func = clsA.attr 
      return func 
     except: 
      # return simple attribute 
      return self.attr 

Il est clair que ce travail dosent, est-il un moyen que je pourrais accéder à la fonction d'instance staticly et remplacer le var "auto"?

+0

'class' ou' def'? –

+0

tnx, classe. édité. – dbkoren

+1

Quoi que vous fassiez, c'est un énorme HACK qui est loin d'être une bonne/bonne solution. Mais si vous persistez à lier les méthodes/fonctions d'une autre classe aux instances de 'bunchClsA', vous pouvez le faire comme ceci dans' buncChlsA .__ getattr__': 'return types.MethodType (vars (clsA) [attr], self)' n'est pas un morceau de code dont on pourrait être fier. Si vous l'utilisez dans vos sources, je vous recommande de ne pas être propriétaire de cette "solution". Je ne comprends pas pourquoi est-ce mieux que d'écrire les méthodes directement dans 'bunchClsA'. – pasztorpisti

Répondre

0

trouvé une bonne solution au problème:

from bunch import Bunch 
import types 
#Original class: 
class A(): 
    y=6 
    def __init__(self,num): 
    self.x=num 
    def funcA(self): 
    print self.x 

#class that wraps A using Bunch(thats what i needed .. u can use another): 
class B(Bunch): 
    def __init__(self, data, cls): 
    self._cls = cls # notice, not an instance just the class it self 
    super(B, self).__init__(data) 

    def __getattr__(self, attr): 
    # Handles normal Bunch, dict attributes 
    if attr in self.keys(): 
     return self[attr] 
    else: 
     res = getattr(self._cls, attr) 
     if isinstance(res, types.MethodType): 
     # returns the class func with self overriden 
     return types.MethodType(res.im_func, self, type(self)) 
     else: 
     # returns class attributes like y 
     return res 

data = {'x': 3} 
ins_b = B(data, A) 
print ins_b.funcA() # returns 3 
print ins_b.y # returns 6 

Et cela résout mon problème, son hack et si vous avez les privilèges, la refonte du code.