元类
元类就是用来创建类的,元类就是类的类。
实例
关于type()函数的使用戳这里
- 元类为一个函数
def upper_attr(class_name,class_parents,class_attr):
"""
遍历属性字典,把不是__开头的属性名字变为大写
:param class_name: 会保存类的名字 Foo
:param class_parents: 会保存类的父类 object
:param class_attr: 会以字典的方式保存所有的类属性
"""
new_attr={}
for name,value in class_attr.items():
if not name.startswith("__"):
new_attr[name.upper()] = value
#调用type来创建一个类
return type(class_name,class_parents,new_attr)
# python3
class Foo(object,metaclass = upper_attr):
bar = 'zip'
print(hasattr(Foo,'bar')) # False
print(hasattr(Foo,"BAR")) # True
f = Foo() #zip
print(f.BAR)
- 元类为一个类
class UpperAttrMetaClass(type):
"""
__new__ 是在__init__之前被调用的特殊方法
__new__ 是用来创建对象并返回的方法
而__init__只是用来将传入的参数初始化给对象
很少使用到__new__,除非你希望能够控制对象的创建
这里,创建的对象是类,你也可以在__init__中做些事情
"""
def __new__(cls,class_name,class_parents,class_attr):
"""遍历属性字典,把不是__开头的属性名字变为大写"""
new_attr={}
for name,value in class_attr.items():
if not name.startswith("__"):
new_attr[name.upper()] = value
#调用type来创建一个类
return type(class_name,class_parents,new_attr)
# python3 语法
class Foo(object,metaclass = UpperAttrMetaClass):
bar = 'zip'
# python2 语法
# class Foo(object):
# #设置Foo类的元类为UpperAttrMetaClass
# __metaclass__ = UpperAttrMetaClass
# bar = 'zip'
print(hasattr(Foo,'bar')) # False
print(hasattr(Foo,"BAR")) # True
f = Foo()
print(f.BAR) # zip
网友评论