Python -- OOP高级 -- 元类
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
除了使用type()
动态创建类以外,要控制类的创建行为,还可以使用元类(metaclass)。
先定义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__()
方法接收到的参数依次是:
-
当前准备创建的类的对象;
-
类的名字;
-
类继承的父类集合;
-
类的方法集合。
应用实例
ORM(Object Relational Mapping),即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句。
KEEP LEARNING!