2011-01-29 1 views
1

Est-ce que les méthodes-classes python ont elles-mêmes une méthode/membre, qui indique la classe à laquelle elles appartiennent?Python: Récupère la classe à laquelle appartient une méthode

Par exemple ...:

# a simple global function dummy WITHOUT any class membership 
def global_function(): 
print('global_function') 

# a simple method dummy WITH a membership in a class 
class Clazz: 
def method(): 
    print('Clazz.method') 

global_function() # prints "global_function" 
Clazz.method() # prints "Clazz.method" 

# until here, everything should be clear 

# define a simple replacement 
def xxx(): 
print('xxx') 

# replaces a certain function OR method with the xxx-function above 
def replace_with_xxx(func, clazz = None): 
if clazz: 
    setattr(clazz, func.__name__, xxx) 
else: 
    func.__globals__[func.__name__] = xxx 

# make all methods/functions print "xxx" 
replace_with_xxx(global_function) 
replace_with_xxx(Clazz.method, Clazz) 

# works great: 
global_function() # prints "xxx" 
Clazz.method() # prints "xxx" 

# OK, everything fine! 
# But I would like to write something like: 
replace_with_xxx(Clazz.method) 
# instead of 
replace_with_xxx(Clazz.method, Clazz) 
# note: no second parameter Clazz! 

Maintenant, ma question est la suivante: Comment est-il possible, d'obtenir toutes les méthodes/appels de fonction print "xxx", SANS l'argument "clazz = Aucun" dans le replace_with_xxx fonction???

Y at-il quelque chose comme possible:

def replace_with_xxx(func): # before it was: (func, clazz = None) 
if func.has_class(): # something possible like this??? 
    setattr(func.get_class(), func.__name__, xxx) # and this ??? 
else: 
    func.__globals__[func.__name__] = xxx 

Merci beaucoup pour la lecture. J'espère, je pourrais faire un peu clair, ce que je veux. Bonne journée! :)

+3

Quelle idée terrible. Pourquoi essayez-vous de modifier la structure d'une classe? Pourquoi ne pas définir une nouvelle classe? Pourquoi ne pas utiliser un modèle de conception plus simple comme ** Stratégie **? –

+0

Quel est le problème que vous essayez de résoudre? –

Répondre

1

Je ne pense pas que cela soit possible et comme une explication simple pourquoi nous devrions penser à suivre: vous pouvez définir une fonction et l'attacher à la classe sans aucune déclaration supplémentaire et elle sera stockée comme un champ de la classe. Et vous pouvez affecter la même fonction en tant que méthode de classe à 2 classes différentes ou plus. Par conséquent, les méthodes ne doivent pas contenir d'informations sur la classe.

1

Clazz.method aura un attribut im_class, qui vous indiquera la classe. Cependant, si vous vous trouvez vouloir faire cela, cela signifie probablement que vous faites quelque chose à la dure. Je ne sais pas ce que vous essayez d'accomplir, mais c'est une très mauvaise façon de faire n'importe quoi, sauf si vous n'avez pas d'autre choix.

0

Pour les méthodes enveloppées dans @classmethod, la méthode sera liée et contiendra la référence im_self pointant vers la classe.

Questions connexes