Tarea 24

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

Supongo que te gusta

Origin www.cnblogs.com/achai222/p/12709792.html
Recomendado
Clasificación