• 元类作业


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

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

      

  • 相关阅读:
    黄聪:手机移动端建站Jquery+CSS3+HTML5触屏滑动特效插件、实现触屏焦点图、图片轮展图
    黄聪:VS2010开发如何在c#中使用Ctrl、Alt、Tab等全局组合快捷键
    利用python实现汉字转拼音
    python 获得质数
    将你的python转成exe格式
    python 动画
    python 饼状图
    python 抓屏
    python 图像迷糊
    python-opencv-圆、椭圆与任意多边形的绘制
  • 原文地址:https://www.cnblogs.com/Tornadoes-Destroy-Parking-Lots/p/12708880.html
Copyright © 2020-2023  润新知