Page tree
Skip to end of metadata
Go to start of metadata

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()

参考:

  • No labels
Write a comment...