Python插件机制

python插件机制

python 可用于制作脚本化的环境,插件机制,面向接口的编程,为程的扩展提供了方便。

type方法,元类方法

class type(object) 
class type(name, bases, dict) 
  1. type用来查询类的名称。<class ‘int’>.
  2. type方法用来进行类的实例化创建,类似于JAVA中的反射。
  3. 如果从type类来继承,则需要重写__new__方法

类创建实例的顺序:

1. type.__new__(...)
2. type.__init__(...)

python 2.x中的__metaclass__属性,声明元类

__metaclass__能有什么用处,先来个感性的认识: 1. 你可以自由的、动态的修改/增加/删除 类的或者实例中的方法或者属性 2. 批量的对某些方法使用decorator,而不需要每次都在方法的上面加入@decorator_func 3. 当引入第三方库的时候,如果该库某些类需要patch的时候可以用metaclass 4. 可以用于序列化(参见yaml这个库的实现,我没怎么仔细看) 5. 提供接口注册,接口格式检查等 6. 自动委托(auto delegate) 7. ...

  你可以在实现一个类的时候为其添加__metaclass__属性:

# python 2.x

class Foo(object):
	__metaclass__ = something
...

# python3.x版本

class Meta(type):
   	 pass
class MyClass(metaclass=Meta):
   	 pass

如果你这么做了, python就会用元类来创建类Foo. 当在内存中创建类对象Foo时, python会在类的定义中寻找__metaclass__属性, 如果找到了, python就用它来创建Foo, 如果没有找到, 就会用内建的type元类来创建这个类.

当你实现一个有继承的类时:

class Foo(Bar):
	pass

python会做如下操作:

Foo中有__metaclass__这个属性吗? 如果有, python会在内存中通过__metaclass__创建一个名字为Foo的类对象. 如果python没有找到__metaclass__, 它会继续在Bar(父类)中寻找__metaclass__, 以此类推. 如果python在任何父类中都没有找到__metaclass__, 它就会在模块层次中寻找__metaclass__. 如果还是找不到__metaclass__, python就会用内置的type元类来创建这个类对象.

由于在我们自定义的元类里面可以定制那些__metaclass__指过来的类, 因此元类的主要目的一般是为了当创建类时自动的改变类, 或者说定制类.

python注解

Python3.0之后加入新特性Decorators,以@为标记修饰function和class。有点类似c++的宏和java的注解。Decorators用以修饰约束function和class,分为带参数和不带参数,影响原有输出,例如类静态函数我们要表达的时候需要函数前面加上修饰@staticmethod或@classmethod,具体内容可以查看:官方解释

参考:

  1. Python搭建插件式框架(基于组件开发)
  2. python中的__metaclass__
  3. Python中的__metaclass__=type什么意思
  4. Python中的注解“@”