疫情环境下的网络学习笔记 python 4.15 作业

4.15作业

  1. 在元类中控制把自定义类的数据属性都变成大写

    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?'
    
  2. 在元类中控制自定义的类无需__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__)
    
  3. 在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性

    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)
    
  4. 基于元类实现单例模式

    需求:实例化多次,指向同一个内存地址

    #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)
    
posted @ 2020-04-15 19:36  黑猫警长紧张  阅读(110)  评论(0)    收藏  举报