Be Pythonic: Python元类(meta class)了解一下
Python元类(meta class)确实很少用到。但聪明如你我,都知道"元"这个字可不是能够随便乱用的,比如元气,元素, 元年,元帅,状元......, 是不是听着都很觉得Niubility,而事实上古文里“元”同“玄”。Python元类,大家了解一下。
首先,理清一下类别和关系
- 1. type
- 2. metaclass(元类,或者叫类生成器
- 3. class(类,或者叫实例生成器)
- 4. instance(实例)
- 5. method, variable, property
type可以直接生成class,也可以生成元类metaclass。
metaclass可以生成class
class实例化得到instance
class和instance可以调用method, variable, property
使用type直接创建class
def greet(self, name='world'): print('Hello, %s' % name) Hello = type('Hello', (object,), dict(my_greet=greet)) hello = Hello() hello.my_greet() >>>Hello, world
通过type, 以一个method为基础,创建出了一个class。
type创建class时需要3个实参:
- 类名: 是个字符串
- 父类: 父类是个元组,因为父类可以是多个,当前父类是object, object是python非常基础的类, 一般我们生成一个新式类,只用继承object就行。
- 需要调用的方法和属性: 这是一个字典
使用type创建metaclass
class ListMetaclass(type): def __new__(cls, name, bases, attrs): attrs['add'] = lambda self, value: self.append(value) attrs['delete'] = lambda self, value: self.remove(value) attrs['is_list'] = lambda self: isinstance(self, list) attrs['length'] = lambda self: len(self) return type.__new__(cls, name, bases, attrs) class MyList(list): __metaclass__ = ListMetaclass mylist = MyList() mylist.add(1) mylist.add(2) mylist.add(3) print mylist print mylist.length() mylist.delete(1) print mylist print mylist.is_list() >>>[1, 2, 3] >>>3 >>>[2, 3] >>>True
- 通过继承type类,生成了元类ListMetaclass, 添加4个自定义的方法, 'add', 'delete', 'is_list', 'length'
- 通过继承list类和设置__metaclass__生成类MyList,再生成MyList的实例,并分别调用新生成的4个方法
- 上面是Python2的写法,如果是Python3,需要改成:
class MyList(list, metaclass=ListMetaclass): pass
未完待续...
请先 后发表评论~