Python元类

2020-02-17  本文已影响0人  莫忘初心_倒霉熊

元类

元类就是用来创建类的,元类就是类的类。

实例

关于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
上一篇 下一篇

猜你喜欢

热点阅读