Tarea 24
1. Control en la metaclase para cambiar los atributos de datos de la clase personalizada a mayúsculas
class Mymeta(type):
def __init__(self, class_name, class_base, class_dict):
super().__init__(self)
self.__name__ = class_name
self.class_base = class_base
def __new__(cls, class_name, class_base, class_dict):
new_class_dict = {}
for k, v in class_dict.items():
if callable(v) or k.startswith("__"):
# if not isinstance(v,str) or k.startswith('__'):
new_class_dict[k] = v
else:
new_class_dict[k.upper()] = v
class_dict = new_class_dict
return type.__new__(cls, class_name, class_base, class_dict)
def __call__(self, *args, **kwargs):
class_obj = self.__new__(self, *args, **kwargs)
self.__init__(class_obj, *args, **kwargs)
return class_obj
class People(object,metaclass=Mymeta):
flag = True
msg = "fdsfsa"
def __init__(self, name, age):
self.name = name
self.age = age
def say(self):
print(f"{self.name}---{self.age}")
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
print(People.__dict__)
print(People.__bases__)
print(People.class_base)
print(People)
print(People.__name__)
2. El método __init__ no es necesario para controlar la clase personalizada en la metaclase
1. Las metaclases les ayudan a crear objetos e inicializar operaciones;
2. Se requiere que el parámetro pasado durante la creación de instancias debe ser en forma de palabras clave, de lo contrario se produce una excepción. TypeError: debe utilizar el argumento de palabra clave
3.key como el atributo del objeto generado por la clase definida por el usuario, y todos los atributos se convierten en mayúsculas
class Mymeta(type):
def __init__(self, class_name, class_base, class_dict):
self.__name__ = class_name
self.class_base = class_base
def __new__(cls, class_name, class_base, class_dict):
return type.__new__(cls, class_name, class_base, class_dict)
def __call__(self, *args, **kwargs):
class_obj = self.__new__(self, *args, **kwargs)
if args:
raise TypeError("不能传入位置参数must use keyword argument")
for k,i in kwargs.items():
class_obj.__dict__[k.upper()] = i
return class_obj
class People(object,metaclass=Mymeta):
flag = True
msg = "fdsfsa"
# def say(self):
# print(f"{self.name}---{self.age}")
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
person1 = People(name = "wu",age=18)
print(person1.NAME)
3. En la metaclase, todos los atributos relacionados con los objetos generados por la clase personalizada son atributos ocultos.
class Mymeta(type):
def __init__(self,class_name,class_base,class_dict):
self.class_name = class_name
self.class_base = class_base
self.class_dict = class_dict
def __new__(cls,*args, **kwargs):
return type.__new__(cls,*args, **kwargs)
def __call__(self, *args, **kwargs):
class_obj = self.__new__(self,*args, **kwargs)
self.__init__(class_obj,*args, **kwargs)
new_dict = {}
for k,v in kwargs.items():
if not k.startswith("__"):
k = f"_{self.class_name}__{k}"
new_dict[k] = v
class_obj.__dict__ = new_dict
return class_obj
class People(object,metaclass=Mymeta):
flag = True
msg = "fdsfsa"
def __init__(self,name, age):
self.name = name
self.age = age
def say(self):
print(f"{self.name}---{self.age}")
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
person1 = People(name = "wu",age=18)
print(person1.__dict__)
4. Implemente el patrón singleton basado en metaclases
Singleton: una instancia única, que se refiere al resultado de varias instancias de la misma clase apuntando al mismo objeto, que se utiliza para ahorrar espacio en la memoria
Si leemos la configuración del archivo de configuración para crear instancias, bajo la misma configuración, no hay necesidad de generar repetidamente objetos para desperdiciar memoria
El contenido del archivo settings.py es el siguiente
HOST='1.1.1.1'
PORT=3306