¿Existe un método incorporado en Python para obtener una matriz de todas las variables de instancia de una clase? Por ejemplo, si tengo este código:
class hi:
def __init__(self):
self.ii = "foo"
self.kk = "bar"
¿Hay alguna manera de hacer esto?
>>> mystery_method(hi)
["ii", "kk"]
Editar: originalmente había pedido variables de clase por error.
python
methods
instance-variables
Chris Bunch
fuente
fuente
Respuestas:
Cada objeto tiene una
__dict__
variable que contiene todas las variables y sus valores.Prueba esto
fuente
Utilice vars ()
fuente
__method
es privado,__method__
es un método especial, no necesariamente privado; Me gustaría decir que los métodos especiales definen las capacidades de un objeto en lugar de los métodos.__method__
es bastante feo, y creo que han sido nombrados de esa manera para tratar de disuadir a la gente de usarlos a menos que sea absolutamente necesario. En este caso tenemos la alternativa vars ().__str__
,__method__
son para la propia lengua normalmente. ¿Qué pasa cuando tústr(something)
?Normalmente no puede obtener atributos de instancia dada solo una clase, al menos no sin instanciar la clase. Sin embargo, puede obtener atributos de instancia dada una instancia, o atributos de clase dada una clase. Consulte el módulo "inspeccionar". No puede obtener una lista de atributos de instancia porque las instancias realmente pueden tener cualquier cosa como atributo y, como en su ejemplo, la forma normal de crearlas es simplemente asignándolas en el método __init__.
Una excepción es si su clase usa ranuras, que es una lista fija de atributos que la clase permite que tengan las instancias. Las ranuras se explican en http://www.python.org/2.2.3/descrintro.html , pero existen varias dificultades con las ranuras; afectan el diseño de la memoria, por lo que la herencia múltiple puede ser problemática, y la herencia en general también debe tener en cuenta las ranuras.
fuente
Tanto el método Vars () como el dict funcionarán para el ejemplo que publicó el OP, pero no funcionarán para objetos definidos "libremente" como:
Para imprimir todos los atributos no invocables, puede utilizar la siguiente función:
fuente
exec('print object.%s\n\n') % i
debe escribirse comoprint getattr(object, i)
También puede probar si un objeto tiene una variable específica con:
fuente
Su ejemplo muestra "variables de instancia", no realmente variables de clase.
Busque
hi_obj.__class__.__dict__.items()
las variables de clase, junto con otros miembros de la clase, como funciones miembro y el módulo contenedor.Las variables de clase son compartidas por todas las instancias de la clase.
fuente
Sugerir
En otras palabras, básicamente envuelve __dict__
fuente
Aunque no es una respuesta directa a la pregunta de OP, hay una manera bastante agradable de averiguar qué variables están dentro del alcance de una función. echa un vistazo a este código:
El atributo func_code tiene todo tipo de cosas interesantes. Te permite hacer algunas cosas interesantes. Aquí hay un ejemplo de cómo lo he usado:
fuente
construido sobre la respuesta de dmark para obtener lo siguiente, que es útil si desea el equivalente de sprintf y, con suerte, ayudará a alguien ...
fuente
A veces, desea filtrar la lista según las variables públicas / privadas. P.ej
fuente