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~