zoukankan      html  css  js  c++  java
  • 元类练习题

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

    class Mymetaclass(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 type.__new__(cls, name, bases, update_attrs)
    
    class Chinese(metaclass=Mymetaclass):
        country = 'China'
        tag = 'Legend of the Dragon'
        def walk(self):
            print('%s is walking' %self.name)
    
    print(Chinese.__dict__)
    """
    {'__module__': '__main__',
     'COUNTRY': 'China', 
     'TAG': 'Legend of the Dragon',
     'walk': <function Chinese.walk at 0x1040211e0>,
     '__dict__': <attribute '__dict__' of 'Chinese' objects>, 
     '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, 
     '__doc__': None}
    """

    练习二:在元类中控制自定义的类无需init方法

    1.元类帮其完成创建对象,以及初始化操作;

    2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument

    3.key作为用户自定义类产生对象的属性,且所有属性变成大写

    class Mymetaclass(type):
    
        def __call__(self, *args, **kwargs):
            if args:
                raise TypeError('must use keyword argument for key function')
            obj = object.__new__(self)  # 创建对象,self为类Foo
    
            for k,v in kwargs.items():
                obj.__dict__[k.upper()] = v
            return obj
    
    
    class Chinese(metaclass=Mymetaclass):
        country = 'China'            # 需要大写的数据属性
        tag = 'Legend of the Dragon'
        def walk(self):
            print('%s is walking' %self.name)
    
    p=Chinese(name='Jack', age=18, sex='male')
    print(Chinese.__dict__)
    """
    {'__module__': '__main__', 
    'country': 'China', 
    'tag': 'Legend of the Dragon', 
    'walk': <function Chinese.walk at 0x1040211e0>, 
    '__dict__': <attribute '__dict__' of 'Chinese' objects>, 
    '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, 
    '__doc__': None}
    """
  • 相关阅读:
    Struts2之Action基础与配置
    关于Struts2的类型转换详解
    Struts2自定义类型转换器
    MyEclipse 快捷键
    Struts2中的ActionContext
    struts2中的action访问web对象
    5.9每日一题题解
    5.8 每日一题题解
    5.7 每日一题题解
    5.6 每日一题题解
  • 原文地址:https://www.cnblogs.com/xiugeng/p/8944780.html
Copyright © 2011-2022 走看看