python 类demo(2)__metaclass__批量化添加属性
来源:互联网 发布:上海淘宝客服招聘 编辑:程序博客网 时间:2024/06/05 11:36
__metaclass__批量化添加属性
>>> def ma(cls):#注意cls 不然报错。没有ma属性print 'method a'>>> def mb(cls):#注意cls 不然报错。没有mb属性print 'method b'>>> method_dict = {'ma':ma,'mb':mb}>>> class Dy(type):def __new__(cls,name, bases, dct):if name[:3] == 'Abc':dct.update(method_dict)return type.__new__(cls, name, bases, dct)def __init__(cls, name, bases, dct):super(Dy,cls).__init__(name,bases,dct)>>> class AbcTest(object):__metaclass__ = Dydef mc(self,x):print x *3>>> class NotAbc(object):__metaclass__ = Dydef md(self,x):print x * 3>>> def main():a = AbcTest()a.mc(3) #实例 a 调用 AbcTest 的 mc() #9a.ma() #因为DY类中增加了 ma,mb 属性,所以可以调用 ma,mb 函数 #method aprint dir(a) #返回实例 a 拥有的属性b = NotAbc() print dir(b)#实例 b 没有增加 ma,mb 属性>>> main()9method a['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__','__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'ma', 'mb', 'mc']['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__','__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'md']
通过__metaclass__ = 调用类 动态的给类 AbcTest() 添加属性,(判断类的名称)
#!/usr/bin/python #coding :utf-8 from types import FunctionType def login_required(func): print 'login check logic here' return func class LoginDecorator(type): def __new__(cls, name, bases, dct): for name, value in dct.iteritems(): if name notin ('__metaclass__','__init__', '__module__')and\ type(value) == FunctionType: value = login_required(value) dct[name] = value return type.__new__(cls, name, bases, dct) class Operation(object): __metaclass__ = LoginDecorator def delete(self, x): print 'deleted %s' % str(x) def main(): op = Operation() op.delete('test') if __name__ == '__main__': main()
2. 批量的对某些方法使用decorator,而不需要每次都在方法的上面加入@decorator_func 这个其实有应用场景的,就是比如我们cgi程序里面,很多需要验证登录或者是否有权限的,只有验证通过之后才 可以操作。那么如果你有很多个操作都需要这样做,我们一般情况下可以手动在每个方法的前头用@login_required 类似这样的方式。那如果学习了metaclass的使用的话,这次你也可以这样做: 这样子你就可以不用在delete函数上面写@login_required, 也能达到decorat的效果了。不过可读性就差点了。
阅读全文
0 0
- python 类demo(2)__metaclass__批量化添加属性
- Python中的元类(__metaclass__)
- python元类__metaclass__
- [Python]元类和__metaclass__
- python当中__metaclass__探讨
- python __metaclass__ metaclass
- __metaclass__
- Python中的__metaclass__=type什么意思
- Python中的__metaclass__=type什么意思
- Zencart产品属性批量添加
- 为Discuz! X3.2批量添加用户的python脚本
- Python __new__, __init__, __metaclass__, __call__, __del__, __getattr__, __getattribute__
- Python 单例模式详解 __new__, import ,__dict__,__metaclass__
- 批量添加类例子
- iis日志和tomcat访问日志批量分析demo(python)
- Python批量添加库搜索路径
- Python代码块批量添加Tab缩进
- GEF放在ViewPart中demo(adapter添加属性视图)
- [Unity][Android][LUA][IOS]读取写入txt文件
- leetcode-606. Construct String from Binary Tree
- 安装deb软件包时出现Unknown media type in type **/** 的解决办法
- 【蓝桥杯】【第一个数字】
- 硬件工程师到底要会多少东西?
- python 类demo(2)__metaclass__批量化添加属性
- 汉诺塔移动
- 快速幂的使用,干掉了一道
- Bloom Filter介绍
- 【数据建模 极端值的检测】离群值检测
- bzoj 2001: [Hnoi2010]City 城市建设
- Power BI 利用Streaming Dataset 实现实时更新
- 父类中访问子类成员
- iOS_Cordova开发教程