Tengo una función que toma otra función como parámetro. Si la función es miembro de una clase, necesito encontrar el nombre de esa clase. P.ej
def analyser(testFunc): print testFunc.__name__, 'belongs to the class, ...
pensé
testFunc.__class__
resolvería mis problemas, pero eso solo me dice que testFunc es una función.
testFunc.im_class
https://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy
im_class
es la clase deim_self
para métodos enlazados o la clase que solicitó el método para métodos no enlazados
Desde Python 3.3, .im_class
se ha ido. Puedes usar .__qualname__
en .__qualname__
lugar. Aquí está el PEP correspondiente: https://www.python.org/dev/peps/pep-3155/
class C: def f(): pass class D: def g(): pass print(C.__qualname__) # 'C' print(Cf__qualname__) # 'Cf' print(CD__qualname__) #'CD' print(CDg__qualname__) #'CDg'
No soy un experto en Python, pero ¿esto funciona?
testFunc.__self__.__class__
Parece que funciona para los métodos enlazados, pero en su caso, puede estar usando un método independiente, en cuyo caso esto podría funcionar mejor:
testFunc.__objclass__
Aquí está la prueba que utilicé:
Python 2.5.2 (r252:60911, Jul 31 2008, 17:31:22) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import hashlib >>> hd = hashlib.md5().hexdigest >>> hd >>> hd.__self__.__class__ >>> hd2 = hd.__self__.__class__.hexdigest >>> hd2 >>> hd2.__objclass__
Oh sí, otra cosa:
>>> hd.im_class Traceback (most recent call last): File "", line 1, in AttributeError: 'builtin_function_or_method' object has no attribute 'im_class' >>> hd2.im_class Traceback (most recent call last): File "", line 1, in AttributeError: 'method_descriptor' object has no attribute 'im_class'
Así que si quieres algo a prueba de balas, debería manejar __objclass__
y __self__
también. Pero tu kilometraje puede variar.
los métodos de instancia tendrán atributos .im_class .im_func .im_self
http://docs.python.org/library/inspect.html#types-and-members
Probablemente quiera ver si la función tiene un .im_class y obtener la información de la clase desde allí.