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