元类作业
# 练习一:在元类中控制把自定义类的数据属性都变成大写
# 1、在元类中控制把自定义类的数据属性都变成大写 class Mymeta(type): def __new__(cls, name, bases, attrs): update_attrs = {} for k, v in attrs.items(): if not callable(v) and not k.startswith('__'): update_attrs[k.upper()] = v else: update_attrs[k] = v return super().__new__(cls, name, bases, update_attrs) class Foo(metaclass=Mymeta): name = 'zxc' def walk(self): print(f'{self.name} walk') print(Foo.__dict__) # 2、在元类中控制自定义的类无需__init__方法 class Mymeta(type): def __call__(self, *args, **kwargs): if args: raise TypeError('must use keyword argument for key function') obj = object.__new__(self) for k, v in kwargs.items(): obj.__dict__[k.upper()] = v return obj class Foo(metaclass=Mymeta): name = 'zxc' def walk(self): print(f'{self.name} walk') p=Foo(name='lilin',age=18,sex='male') print(p.__dict__) # 3、在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性 class Mymeta(type): # def __init__(self, class_name, class_bases, class_dic): # # 控制类Foo的创建 # super().__init__(class_name, class_bases, class_dic) def __call__(self, *args, **kwargs): obj = self.__new__(self) self.__init__(obj, *args, **kwargs) obj.__dict__ = {f'_{self.__name__}__{k}':v for k,v in obj.__dict__.items()} return obj class Foo(object, metaclass=Mymeta): def __init__(self, name, age): self.name = name self.age = age obj = Foo('zxc', '23') print(obj.__dict__) # 4、基于元类实现单例模式 class Mymeta(type): def __init__(self,name,bases,dic): self.__instance = object.__new__(self) self.__init__(self.__instance, '3.1.1.1',2224) super().__init__(name,bases,dic) def __call__(self, *args, **kwargs): if args or kwargs: obj=object.__new__(self) self.__init__(obj,*args,**kwargs) return obj return self.__instance class Mysql(metaclass=Mymeta): def __init__(self,host,port): self.host=host self.port=port obj1=Mysql() obj2=Mysql() print(obj1 is obj2 is obj2) obj4=Mysql('3.1.1.1',2224)