在Python中一切接对象,类也是一个对象,所有的类都是有type类创建,我们实际开发中最常用的type方法,是用来获取某个对象的类型的,例如type(1) ⇒ int 、type(‘str’) ⇒ str。但是type还有一种用法,就是用来创建类的。
值得注意的是:在类中方法也是一种属性,只不过该属性的值是函数地址而已,因此使用type创建类时,我们也可以创建类的一些方法。 例如:
# 通过type动态创建有类,添加类方法、静态方法、实例方法 @classmethod def eat(cls): print('类方法') @staticmethod def say(): print('静态方法') def get_age(self): print('今年%d岁了' % self.age) People = type('People', (), {'age': 2, 'eat': eat, 'say': say, 'get_age': get_age}) p = People() People.eat() p.eat() p.say() People.say() p.get_age()__metaclass__属性,Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类,如果没有找到,就会用内建的type来创建这个类
def upper_attr(cls, bases, attrs): ''' 自定义元类,将所有的共有属性名都变成大写的属性名 ''' newAttr = {} for key, val in attrs.items(): if not key.startswith('__'): newAttr[key.upper()] = val return type(cls, bases, newAttr) class People(object, metaclass=upper_attr): name = 'asd' age = 18 p = People() print(p.NAME) # p.name 会报属性找不到 print(p.AGE)