課題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