Be Pythonic: Python元类(meta class)了解一下

On the way of Pythonic

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

未完待续...

未完待续...

举报
评论 0