类
class Hello(object): def hello(self): print "hello world" h = Hello() print(type(Hello)) # <type 'type'> print(type(h)) # <class 'Hello'>
使用type()创建类
要创建一个class对象,type()
函数依次传入3个参数:
- class的名称;
- 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
- class的方法名称与函数绑定,这里我们把函数
fn
绑定到方法名hello
上。
def fn(self): print "hello world" Hello = type("Hello", (object,), dict(hello=fn)) h = Hello() # 效果跟上面的一样
元类metaclass
除了使用type()
动态创建类以外,要控制类的创建行为,还可以使用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 # 指示使用ListMetaclass来定制类 L = MyList() L.add(1) print(L) # [1]
一个例子
#!/usr/bin/env python # -*- coding: utf-8 -*- BuffClass = {} class BuffMetaclass(type): def __new__(cls, name, bases, attrs): cls = type.__new__(cls, name, bases, attrs) return BuffClass.setdefault(cls.__name__, cls) class BaseBuff(object): __metaclass__ = BuffMetaclass class SleepBuff(BaseBuff): pass def main(): print(BuffClass) if __name__ == "__main__": main()
参考:
Add Comment