Cinco métodos mágicos relacionados con las propiedades de Python

Este artículo ha participado en la actividad "Ceremonia de creación de recién llegados", y hemos iniciado juntos el camino de la creación de Nuggets.

prefacio

Hoy, quiero presentarles cinco métodos mágicos. Todos están relacionados con los atributos de Python, que implican obtener, eliminar y modificar atributos. Echemos un vistazo.

método __getattribute__

Comencemos definiendo una clase simple sin problemas para acceder a las propiedades.

class User:

    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


u1 = User('li', 'male')
print(u1.name)

li
复制代码

Luego agregamos el método __getattribute__, y el atributo de acceso se entregará a este método.

class User:

    def __getattribute__(self, item):
        return 6

    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


u1 = User('li', 'male')
print(u1.name)

6
复制代码

Lo que es aún más sorprendente es que devuelve 6 ya sea que exista o no esta propiedad.

class User:

    def __getattribute__(self, item):
        return 6

    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


u1 = User('li', 'male')
print(u1.test)

6
复制代码
  • Activado cuando: activado cuando se accede a la propiedad del miembro del objeto, ya sea que exista o no.
  • Rol: Realice algún procesamiento en el atributo.
  • Parámetros: self es el objeto actual, item es una cadena para acceder al nombre de la propiedad.
  • Valor devuelto: valor de la propiedad.

Cabe señalar aquí que el valor de retorno no debe usar self.name, que se repetirá infinitamente.Podemos usar el método __getattribute__ del objeto para acceder.

class User:

    def __getattribute__(self, item):
        return object.__getattribute__(self, item)

    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


u1 = User('li', 'male')
print(u1.name)

li
复制代码

método __getattr__

  • Tiempo de activación: se activa cuando se accede a una propiedad de objeto inexistente.
  • Efecto: Al acceder a una propiedad inexistente, no se reportará ningún error.
  • Parámetros: self es el objeto actual, item es una cadena para acceder al nombre de la propiedad.
  • Valor devuelto: valor de la propiedad.

Tomemos un ejemplo simple, es decir, el usuario puede generar el nombre del atributo, luego todos devolvemos el atributo de nombre de manera uniforme.

class User:

    def __getattr__(self, item):
        return self.name

    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


u1 = User('li', 'male')
print(u1.na2me)

li
复制代码

método __setattr__

  • Tiempo de activación: se activa al agregar y modificar las propiedades del objeto.
  • Rol: Restringir la operación de agregar y modificar propiedades de objetos.
  • Parámetros: self es el objeto actual, key es el nombre de la propiedad del objeto establecido y value es el valor establecido.
  • Valor devuelto: Ninguno.

Por ejemplo, permitimos que los usuarios cambien el nombre, pero no el sexo.

class User:

    sex = 'male'

    def __setattr__(self, key, value):
        if key == 'sex':
            pass
        else:
            object.__setattr__(self, key, value)

    def __init__(self, name):
        self.name = name


u1 = User('li')
u1.name = 'test'
u1.sex = 'female'
print(u1.name, u1.sex)

test male
复制代码

método __delattr__

  • Tiempo de activación: se activa cuando se elimina una propiedad de objeto.
  • Rol: Restringir la operación de agregar y modificar propiedades de objetos.
  • Parámetros: self es el objeto actual, item es el nombre de la propiedad del objeto eliminado.
  • Valor devuelto: Ninguno.

Podemos permitir que los usuarios eliminen el sexo, pero no el nombre.

class User:

    def __delattr__(self, item):
        if item == 'sex':
            pass
        else:
            object.__delattr__(self, item)

    def __init__(self, name, sex):
        self.name = name
        self.sex = sex


u1 = User('li', 'male')
del u1.sex
print(u1.sex)
del u1.name
print(u1.name)

male
AttributeError: 'User' object has no attribute 'name'
复制代码

método __dir__

Este método devuelve una lista de todos los nombres de miembros de una clase u objeto, que no se usa mucho.

orden de acceso a la propiedad

Finalmente, enumero el orden de acceso a los atributos para su referencia y estudio.

  • __obteneratributo__
  • descriptor de datos
  • propiedades del objeto actual
  • propiedades de clase
  • descriptor sin datos
  • propiedades de la clase principal
  • __getattr__

Eso es todo por compartir hoy, hasta la próxima~

Supongo que te gusta

Origin juejin.im/post/7079362967250141192
Recomendado
Clasificación