python 元类 type metaclass

python中一切皆对象,类对象创建实例对象,元类创建类对象,元类创建元类。

元类创建类对象有2中方式:

一、type方法

type(类名, 由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

1 Test = type("Test", (), {})
2 print(Test)
1 <class '__main__.Test'>

二、metaclass

 1 # 元类会自动将你通常传给‘type’的参数作为自己的参数传入
 2 def upper_attr(future_class_name, future_class_parents, future_class_attr):
 3     '''返回一个类对象,将属性都转为大写形式'''
 4     #  选择所有不以'__'开头的属性
 5     print(future_class_name, future_class_parents, future_class_attr)
 6     attrs = ((name, value) for name, value in future_class_attr.items()
 7              if not name.startswith('__'))
 8     # 将它们转为大写形式
 9     uppercase_attr = dict((name.upper(), value) for name, value in attrs)
10 
11     # 通过'type'来做类对象的创建
12     return type(future_class_name, future_class_parents, uppercase_attr)
13 
14 
15 # __metaclass__ = upper_attr  # 这会作用到这个模块中的所有类
16 
17 
18 class Foo(object, metaclass=upper_attr):
19     # 我们也可以只在这里定义__metaclass__,这样就只会作用于这个类中
20     bar = 'bip'
21 
22 
23 print(hasattr(Foo, 'bar'))
24 # 输出: False
25 print(hasattr(Foo, 'BAR'))
26 # 输出:True
27 
28 f = Foo()
29 print(f.BAR)
30 # 输出:'bip'
1 Foo (<class 'object'>,) {'__module__': '__main__', '__qualname__': 'Foo', 'bar': 'bip'}
2 False
3 True
4 bip

 

posted @ 2018-01-04 17:20  魂~  阅读(299)  评论(0编辑  收藏  举报