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

class MyDef(type):
def __new__(cls, class_name, class_attr, class_dic):
upper_data = {}
for k,v in class_dic.items():
if not callable(v) and not k.startswith('__'):
upper_data[k.upper()] = v
else:
upper_data[k] = v
return type.__new__(cls, class_name, class_attr, upper_data) class People(metaclass=MyDef):
time = 'now'
work = 'weekends' print(People.__dict__)
练习二:在元类中控制自定义的类无需__init__方法
 
1.元类帮其完成创建对象,以及初始化操作;
2.要求实例化时传参必须为关键字形式,否则抛出异常TypeError: must use keyword argument
3.key作为用户自定义类产生对象的属性,且所有属性变成大写

class MyDef(type):
def __call__(self, *args, **kwargs):
if args:
raise TypeError(' must use keyword argument')
obj = object.__new__(self)
for k,v in kwargs.items():
obj.__dict__[k.upper()] = v
return obj class People(metaclass=MyDef):
tag = 'China'
some = 'None' p1 = People(name = 'panda')
print(p1.__dict__)
练习三:在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性
# 在元类中控制自定义的类产生的对象相关的属性全部为隐藏属性
class Mymeta(type):
def __init__(self, class_name, class_bases, attr):
super(Mymeta, self).__init__(class_name, class_bases, attr) def __call__(self, *args, **kwargs):
obj = self.__new__(self)
self.__init__(obj, *args, **kwargs )
obj.__dict__ = {'_%s__%s' % (self.__name__, k): v for k, v in obj.__dict__.items()}
return obj
class P(metaclass=Mymeta):
def __init__(self, name, age):
self.name = name
self.age = age
p1 = P('','')
print(p1._P__name)
 
练习四:基于元类实现单例模式
 

最新文章

  1. Hibernate 系列 08 - 对象识别机制
  2. 枚举扩展方法获取枚举Description
  3. JAVA可阻塞队列-ArrayBlockingQueue子类BlockingQueue的应用,使用它来实现子线程打印10次,主线程打印100次,如此反复
  4. CentOS 7.0 安装配置LAMP服务器方法(Apache+PHP+MariaDB)
  5. C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理
  6. js继承精益求精之寄生式组合继承
  7. 51nod1295 XOR key
  8. POJ1056 IMMEDIATE DECODABILITY【数据结构】
  9. web config数据库连接字符串加密
  10. 工作流(Workflow)学习---基础知识整理
  11. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作
  12. MyBatis一次执行多条SQL语句
  13. FMS中实现pull stream
  14. ZOJ-3933-Team Formation【二分图最佳匹配】【KM】
  15. WeihanLi.Redis自定义序列化及压缩方式
  16. 百度地图--JS版
  17. 排序算法(sorting)
  18. Jenkins 利用Build With Parameters Plugin实现Jenkins参数化构建
  19. 32. 安装oracle11g时,先决条件一直失败的解决方法
  20. LINUX系统一一CentOS6.5之tomcat安装

热门文章

  1. LSTM比较RNN
  2. [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)
  3. 深入了解Spring
  4. 服务器重启后启动Docker命令
  5. 【codeforces 799B】T-shirt buying
  6. Hibernate 一对多
  7. PHP 防xss攻击
  8. BA-siemens-insight-event builder使用
  9. C#中的DES加密
  10. CAD教程-AL对其命令