課題24

課題24

1.メタクラスを制御して、カスタムクラスのデータ属性を大文字に変更します。

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.メタクラスのカスタムクラスを制御するために__init__メソッドは必要ありません

1.メタクラスは、オブジェクトの作成と操作の初期化を支援します。

2.インスタンス化中に渡されるパラメーターは、キーワードの形式である必要があります。そうでない場合は、例外がスローされます。TypeError:キーワード引数を使用する必要があります

3.ユーザー定義クラスによって生成されたオブジェクトの属性としてのキー。すべての属性は大文字になります。

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.メタクラスでは、カスタムクラスによって生成されたオブジェクトに関連するすべての属性が非表示の属性です。






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.メタクラスに基づいてシングルトンパターンを実装する

シングルトン:同じオブジェクトを指す同じクラスの複数のインスタンスの結果を参照する単一のインスタンス。メモリスペースを節約するために使用されます。

構成ファイルから構成を読み取ってインスタンス化すると、同じ構成の下で、オブジェクトを繰り返し生成してメモリを浪費する必要がありません。

settings.pyファイルの内容は次のとおりです

HOST='1.1.1.1'
PORT=3306

おすすめ

転載: www.cnblogs.com/achai222/p/12709792.html