Propiedades comunes en clases y objetos

Cada clase y objeto de Python tiene por defecto una serie de propiedades. Ya hemos trabajado con algunas:

__dict__

__dict__ es un diccionario que contiene las propiedades y sus valores de las clases y los objetos. Ejemplo:

class Clase:
    varia = 1
    def __init__(self):
        self.var = 2

    def metodo(self):
        pass

    def __oculto(self):
        pass


objeto = Clase()

print(objeto.__dict__)
print(Clase.__dict__)

__name__

La propiedad contiene el nombre de la clase. El atributo __name__ está ausente del objeto, existe solo dentro de las clases.

Si deseas encontrar la clase de un objeto en particular, puedes usar una función llamada type(), la cual es capaz (entre otras cosas) de encontrar una clase que se haya utilizado para crear instancias de cualquier objeto.

Ejemplo:

class Clase:
    pass


print(Clase.__name__)
objeto = Clase()
print(type(objeto).__name__)

__module__

__module__ es una cadena, almacena el nombre del módulo que contiene la definición de la clase. Ejemplo:

class Clase:
    pass


print(Clase.__module__)
objeto = Clase()
print(objeto.__module__)

Como sabes, cualquier módulo llamado __main__ en realidad no es un módulo, sino es el archivo actualmente en ejecución.

__bases__

__bases__ es una tupla. La tupla contiene clases (no nombres de clases) que son superclases directas de la clase. El orden es el mismo que el utilizado dentro de la definición de clase. Solo las clases tienen este atributo, los objetos no.

Hemos definido una función llamada printBases(), diseñada para presentar claramente el contenido de la tupla:

class SuperUno:
    pass


class SuperDos:
    pass


class Sub(SuperUno, SuperDos):
    pass


def printBases(clase):
    print('( ', end='')

    for x in clase.__bases__:
        print(x.__name__, end=' ')
    print(')')


printBases(SuperUno)
printBases(SuperDos)
printBases(Sub)

La salida será:

( object )
( object )
( SuperUno SuperDos )

Una clase sin superclases explícitas apunta a object (una clase de Python predefinida) como su antecesor directo.