zoukankan      html  css  js  c++  java
  • 元类作业

    # 练习一:在元类中控制把自定义类的数据属性都变成大写

    # 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)
    

      

  • 相关阅读:
    InSAR 大气校正数据 GACOS
    java通用的方法整理
    Jquery实现select左右栏的添加移除
    kendo ui之grid列表
    kendo-ui学习笔记(一)
    kendo-ui学习笔记——题记
    chrome driver驱动地址
    适合引入缓存的业务及影响
    个人测试方法论202108
    Redis缓存
  • 原文地址:https://www.cnblogs.com/Tornadoes-Destroy-Parking-Lots/p/12708880.html
Copyright © 2011-2022 走看看