zoukankan      html  css  js  c++  java
  • 3.3

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

     1 class MyMeta(type):
     2     def __new__(cls, class_name, class_bases, class_dic):
     3         update_attrs = {}
     4         for i in class_dic:
     5             if not callable(class_dic[i]) and not i.startswith('__'):
     6                 update_attrs[i.upper()] = class_dic[i]
     7             else:
     8                 update_attrs[i] = class_dic[i]
     9         return type.__new__(cls, class_name, class_bases, update_attrs)
    10 
    11 
    12 class Chinese(metaclass=MyMeta):
    13     country = 'China'
    14     tag = 'Legend of the Dragon'
    15 
    16     def __init__(self, name):
    17         self.name = name
    18 
    19     def talk(self):
    20         print('%s is talking' % self.name)
    21 
    22 
    23 ch = Chinese('alice')
    24 print(Chinese.__dict__)
    25 '''
    26 {'__module__': '__main__', 'COUNTRY': 'China', 'TAG': 'Legend of the Dragon', 
    27 '__init__': <function Chinese.__init__ at 0x00000235649C0B70>, 
    28 'talk': <function Chinese.talk at 0x00000235649C0BF8>, 
    29 '__dict__': <attribute '__dict__' of 'Chinese' objects>, 
    30 '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None}
    31 
    32 '''

    练习二:在元类中控制自定义的类无需init方法
    1.元类帮其完成创建对象,以及初始化操作;
      2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument
      3.key作为用户自定义类产生对象的属性,且所有属性变成大写

     1 class Mymeta(type):
     2     def __call__(self, *args, **kwargs):
     3         if args:
     4             raise TypeError('must use keyword argument')
     5         obj = object.__new__(self)
     6         for i in kwargs:
     7             obj.__dict__[i.upper()] = kwargs[i]
     8         return obj
     9 
    10 
    11 class Chinese(metaclass=Mymeta):
    12     country = 'China'
    13     tag = 'Lengend of the Dragon'
    14     def talk(self):
    15         print('%s is talking' % self.NAME)
    16 
    17 
    18 ch = Chinese(name='alice', age=12)
    19 print(ch.__dict__)
    20 ch.talk()
    21 '''
    22 {'NAME': 'alice', 'AGE': 12}
    23 alice is talking
    24 '''
  • 相关阅读:
    mysql导出存储过程、函数、视图、触发器
    通过mk-table-checksum与pt-table-sync检查不同库两张表的一致性。
    Linux内核OOM机制的详细分析
    Linux虚拟内存(VM)相关参数解析
    mysqld异常重启后,自动启动应用srm进程
    利用python多线程执行远程linux上命令
    oracle数据库时常用的操作命令
    Oralce_DDL
    Oralce_PL_SQL
    mysqlbackup备份和还原
  • 原文地址:https://www.cnblogs.com/alice-bj/p/8553452.html
Copyright © 2011-2022 走看看