Python 自定义元类的两种写法
有关元类是什么大家自己搜索了解,我这里写一下实现元类的两种写法
# 自定义元类
#继承type
class LowercaseMeta(type):
'''
修改类的属性名称为小写的元类
'''
# __new__ 类的实列的创建 #__init__类的初始化 #方法一:
def __new__(mcs,name,bases,attrs):
lower_attrs={}
for k,v in attrs.items():
if not k.startswith('__'): #排除magic method
lower_attrs[k.lower()]=v
else:
lower_attrs[k]=v
return type.__new__(mcs,name,bases,lower_attrs) # 方法二:
# def __new__(cls, *args, **kwargs):
# #将要替换args
# new_args=[]
# for arg in args:
# if isinstance(arg,dict):
# low_attrs = {}
# for k,v in arg.items():
# if str(k).startswith('__'): #magic method
# low_attrs[k]=v
# else: #排除magic method
# low_attrs[str(k).lower()]=v
# new_args.append(low_attrs)
# else:
# new_args.append(arg)
# return type.__new__(cls,*new_args,**kwargs) #类
class LowercaseClass(metaclass=LowercaseMeta): #py3
BAR=True def HELLO(self):
print('hello') #此时BAT,HELLO 都变为小写
print(dir(LowercaseClass))
LowercaseClass().hello()
两种方法的执行结果相同:

Python 自定义元类的两种写法的更多相关文章
- python之装饰器的两种写法
上一篇文章介绍了 装饰器的概念.现在讲一下在程序中怎么来写装饰器.上代码: def X(fun): def Y(b): print(b) fun() return Y def test(): prin ...
- Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- SpringBoot java配置类@Configuration 的两种写法
首先在Springboot项目中,件一个java类,使用注解@Configuration ,则这个类是SpringBoot bean的创建的配置文件类,,这种配置文件类有两种写法 1.使用包扫描 , ...
- 【转】Python 之 元类
原文链接: https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python http://python.jo ...
- 转---一文读懂 python 的元类
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...
- Python之元类详细解析
一.补充内置函数isinstance和issubclass 1.isinstance是判断一个对象是不是由一个对象产生的 class Foo: pass obj=Foo() print(isinsta ...
- python中元类(metaclass)的理解
原文地址:http://www.cnblogs.com/tkqasn/p/6524879.html 一:类也是对象 类就是一组用来描述如何生成一个对象的代码. 类也是一个对象,只要你使用关键字clas ...
- 对python中元类的理解
1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...
- python基础----元类metaclass
1 引子 class Foo: pass f1=Foo() #f1是通过Foo类实例化的对象 python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载cl ...
随机推荐
- VUE Error: listen EADDRNOTAVAIL: address not available
vue项目运行npm run dev时出现 Error: listen EADDRNOTAVAIL: address not available ... 的错误 原因:配置的IP不对 解决方法:打开c ...
- ASP.NET图片上传和截取
一.介绍:图片的上传直接使用ajax就可以了,截取图片的话使用到Jcrop插件. 图片上传资料:https://www.jb51.net/article/87654.htm 截取图片插件:http:/ ...
- PhantomJS抓取中文文档乱码
使用PhantomJs抓取百度标题乱码 var url="http://www.baidu.com" var page=require('webpage').create() pa ...
- Web前端基础(11):JavaScript(五)
1. 初识DOM 1.1 DOM介绍 1.1.3 什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定 ...
- MyBatis的事物管理和缓存
MyBatis的事物 事物的概念 在Java语言数据库框架中,数据库的事务管理都是非常重要的. 每个业务逻辑都是由一系列数据库访问完成的,这些访问可能修改多条数据记录,这一系列修改应该是一个整体,绝对 ...
- echarts 柱状图
效果: 图一:Y轴显示百分比 柱状图定点显示数量个数 图二:x轴 相同日期对应的每个柱子显示不同类型的数量 代码: 容器: <div id="badQuaAnalyze" ...
- 应用DEV第三方界面控件制作批量添加水印程序
本次应用DevExpress和C#语言制作了一个批量添加水印的程序,看界面效果图: 界面中既可以进行文字水印添加,也可以图片水印添加,同时还可以对水印的位置进行设置,比较实用! 文字水印的具体添加情况 ...
- Spring Boot 2 配置服务器访问日志
Tomcat控制台中看到的日志是服务器的日志,而服务器访问日志则是记录服务处理的请求信息. 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1.8 1.新建一个名 ...
- Ride to Office
[题目描述] 起点与终点相隔4500米.现Charley需要从起点骑车到终点.但是,他有个习惯,沿途需要有人陪伴,即以相同的速度,与另外一个人一起骑.而当他遇到以更快的速度骑车的人时,他会以相应的速度 ...
- PHP时间戳相互转换
1.获取当前时间方法date()很简单,这就是获取时间的方法,格式为:date(format,format,timestamp),format为格式.timestamp为时间戳–可填参数. 2.获取时 ...