疫情环境下的网络学习笔记 python 4.15 作业
4.15作业
-
在元类中控制把自定义类的数据属性都变成大写
class Mymeta(type): def __new__(cls, name,bases,attrs): for attr,val in attrs.items(): if not attr.startswith('_'): attrs.pop(attr) attr = attr.upper() attrs[attr] = val print(attrs) return type.__new__(cls, name,bases,attrs) class Upper(object, metaclass=Mymeta): name = 'Thresh' motto = 'what delighted agony we shall inflict?' -
在元类中控制自定义的类无需
__init__方法1.元类帮其完成创建对象,以及初始化操作;
2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument
3.key作为用户自定义类产生对象的属性,且所有属性变成大写
class Mymeta(type): def __call__(self, *args, **kwargs): if args: raise TypeError('必须是关键字参数') obj = self.__new__(self) for k,v in kwargs.items(): if not k.startswith('_'): obj.__dict__[k.upper()]=v return obj class Upper(object, metaclass=Mymeta): name = 'Thresh' motto = 'what delighted agony we shall inflict?' obj = Upper(age=18) print(obj.__dict__) -
在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性
class Mymeta(type): def __init__(self,class_name,class_bases,class_dic): super(Mymeta,self).__init__(class_name,class_bases,class_dic) def __call__(self, *args, **kwargs): obj = self.__new__(self) self.__init__(obj, *args, **kwargs) obj.__dict__={'_%s__%s' %(self.__name__,k):v for k,v in obj.__dict__.items()} print(obj.__dict__) return obj class Upper(object, metaclass=Mymeta): def __init__(self,name,age): self.name = name self.age = age obj = Upper('deimos',21) -
基于元类实现单例模式
需求:实例化多次,指向同一个内存地址
#settings.py文件内容如下 HOST='1.1.1.1' PORT=3306# 看不太懂 先把答案搬上来 import settings class Mymeta(type): def __init__(self,name,bases,dic): self.__instance = object.__new__(self) # 产生instance对象 self.__init__(self.__instance, settings.HOST, settings.PORT) # 初始化instance # 上述两步可以合成下面一步 # self.__instance=super().__call__(*args,**kwargs) 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() obj3=Mysql() print(obj1 is obj2 is obj3)

浙公网安备 33010602011771号