元类作业
# 练习一:在元类中控制把自定义类的数据属性都变成大写
# 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)

浙公网安备 33010602011771号