Python -- OOP高级 -- 元类
2015-10-22 11:58
691 查看
type()函数既可以返回一个对象的类型,又可以创建出新的类型
def fn(self, name="world"): print("Hello, %s!" % name) Hello = type("Hello", (object,), dict(hello=fn))
h = Hello() >>> h.hello() Hello, world! >>> type(h) Out[165]: __main__.Hello >>> type(Hello) Out[166]: type
要创建一个class对象,
type()函数依次传入3个参数:
class的名称;
继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
class的方法名称与函数绑定,这里我们把函数
fn绑定到方法名
hello上。
metaclass
除了使用[code]type()动态创建类以外,要控制类的创建行为,还可以使用元类(metaclass)。[/code]
先定义metaclass,就可以创建类,最后创建实例。
metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出来的“实例”。
一个简单的例子,这个metaclass可以给我们自定义的MyList增加一个
add方法:
定义
ListMetaclass,按照默认习惯,metaclass的类名总是以Metaclass结尾,以便清楚地表示这是一个metaclass:
# metaclass是类的模板,所以必须从`type`类型派生: class ListMetaclass(type): def __new__(cls, name, bases, attrs): attrs['add'] = lambda self, value: self.append(value) return type.__new__(cls, name, bases, attrs) class MyList(list, metaclass=ListMetaclass): pass
>>> L = MyList() >>> L.add(1) >> L [1]
__new__()方法接收到的参数依次是:[/code]
当前准备创建的类的对象;
类的名字;
类继承的父类集合;
类的方法集合。
应用实例
ORM
ORM(Object Relational Mapping),即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。
相关文章推荐
- python的easy_install安装指南
- Python -- OOP高级 -- 枚举类
- Python -- OOP高级 -- 定制类
- 使用python对url编码解码
- python使用中 第三方库引用路径的问题
- Python 列表 list 数组 array 常用操作集锦
- Python Flask设计Restful
- python2.7安装requests步骤(接口测试)
- Python -- OOP高级 -- __slots__、@property
- python基础
- 多线程实例2
- python python python的魔法函数~还有属性~
- 多线程实例1
- python异常以及面向对象编程
- Gensim Tutorials(一)
- python(4)正则表达式
- Python数据类型详解
- python交互模式下cp65001异常
- python urllib BeautifulSoup抓取去哪儿网站景点部分信息
- python获取当前路径的方法