2016-04-28 13 views
0

Ich habe eine große Klasse, die eine Menge Funktionen und Attribute hat. Die Instanzen werden aus Daten in einer entfernten Datenbank erstellt.Python: Verwenden Sie eine Klasse Methoden als statische, wenn es als Instanz Methoden implementiert

Der Prozess der Erstellung jeder Instanz ist sehr lang und schwer.

In Leistung Sake IVE erstellt eine Bunch-Klasse aus dieser schweren Klasse. Zugriff auf das Attribut ist einfach und funktioniert gut. das Problem ist, wie die Methoden aus dieser Klasse verwendet werden.

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 

klar, daß diese dosent Arbeit, Gibt es eine Möglichkeit i staticly die Instanz-Funktion zugreifen können und das "Selbst" var außer Kraft setzen?

+0

'Klasse' oder' def'? –

+0

tnx, klasse. bearbeitet. – dbkoren

+1

Was auch immer Sie tun, das ist ein riesiger HACK, der weit von einer korrekten/guten Lösung entfernt ist. Aber wenn Sie immer noch darauf bestehen, die Methoden/Funktionen einer anderen Klasse an "bunchClsA" -Instanzen zu binden, dann können Sie das in 'buncChlsA .__ getattr__' tun:' return types.MethodType (vars (clsA) [attr], self) 'Dies ist kein Code, auf den man stolz sein könnte. Wenn Sie dies in Ihren Quellen verwenden, empfehle ich, die Inhaberschaft dieser "Lösung" abzulehnen. Ich verstehe nicht, warum das besser ist, als die Methoden direkt in 'bunchClsA' zu schreiben. – pasztorpisti

Antwort

0

eine schöne Lösung für das Problem gefunden out:

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 

Und das löst mein Problem, es ist ein Hack, und wenn Sie die Privilegien haben, Redesign des Codes.

Verwandte Themen