问题描述
BoardMeta是自定义元类,使用这个自定义元类创建了Board类,程序20行Board类不是已经创建过了吗?
#!/usr/bin/env python
# encoding: utf-8
_board_classes = {}
class BoardMeta(type): #元类
def __init__(cls, name, bases, dct):
super(BoardMeta, cls).__init__(name, bases, dct) #调用父类__init__()函数,父类是type(),用于创建类
if 'abstract' not in cls.__dict__: #属性中不含有abstract返回true
cls.abstract = False
if cls.abstract:
return
board_name = getattr(cls, 'name', name)
_board_classes[board_name] = cls
class Board(object):
abstract = True
def __init__(self):
pass
Board = BoardMeta('Board', Board.__bases__, dict(Board.__dict__)) #使用自定义元类BoardMeta动态创建类Board
class sitl(BoardMeta('Board', Board.__bases__, dict(Board.__dict__))):
pass
class linux(Board):
pass
class pxfplus(linux):
pass
def list_boards():
print(sorted(list(_board_classes.keys())))
list_boards()
以上代码运行输出[sitl, linux, pxfplus],程序是怎么运行的呢?
前面的
class Board(object)
是使用普通的方式创建的一个类名叫Borad
,到了Board = BoardMeta('Board', Board.__bases__, dict(Board.__dict__))
这一行,就是使用BoardMeta
创建的一个新的类了(虽然也叫Board
,并且父类用的是Board.__bases__
,属性用的是dict(Board.__dict__)
,就相当于复制了一个Board
一样,但它已经是一个新的类了)。由于
sitl, linux, pxfplus
这三个类都是(新的那个)Board
的子类,因此在创建这三个类的时候也会使用自定义的元类创建,在这个创建的过程中,就把类名做为key
写到了_board_classes
里可以加上如下代码,查看前后
Board
的type
打印结果如下:
说明第一个
Board
的元类是type
,第二Board
的元类是BoardMeta