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)
    

      

  • 相关阅读:
    http://download.microsoft.com/download/A/9/1/A91D6B2BA79847DF9C7EA97854B7DD18/VC.iso
    你的公积金账户在易才,请联系: 地址:武汉市汉口解放大道686号武汉世界贸易大厦49层612 客服电话:85362651 联系人:刘思明
    22
    http://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html
    多层的一个框 架
    MS Jet SQL for Access 2000中级篇
    窗体间传递复杂数据
    小议数据库主键选取策略(转)
    eWebSoft在线编辑器实例说明
    一个程序详细研究DataReader(转)
  • 原文地址:https://www.cnblogs.com/Tornadoes-Destroy-Parking-Lots/p/12708880.html
Copyright © 2011-2022 走看看