metaclass--元类

metaclass--元类

除了使用type()动态建立类之外,要控制类的建立行为,还能够使用metaclass。 metaclass,直译为元类,简单的解释就是:python

当咱们定义了类之后,就能够根据这个类建立出实例,因此:先定义类,而后建立实例。code

可是若是咱们想建立出类呢?那就必须根据metaclass建立出类,因此:先定义metaclass,而后建立类。io

链接起来就是:先定义metaclass,就能够建立类,最后建立实例。function

因此,metaclass容许你建立类或者修改类。换句话说,你能够把类当作是metaclass建立出>来的“实例”。class

元类特性

1、下面代码展现了元类能够建立类.以及元类的经常使用写法:

class Hello:
    pass


class Base(type):
    def __new__(cls, name, bases, attrs):
        print(f"cls:{cls}")
        print(f"name:{name},type:{type(name)}")
        print(f"bases:{bases},type:{type(bases)}")
        print(f"attrs:{attrs},type:{type(attrs)}")
        print("=" * 50)
        return type.__new__(cls, name, bases, attrs)


class World(metaclass=Base):
    pass


class User(World):
    def say(self):
        pass


print("-" * 50)
print(f"Hello-type:{type(Hello)}")
print(f"World-type:{type(World)}")

"""
cls:<class '__main__.Base'>
name:World,type:<class 'str'>
bases:(),type:<class 'tuple'>
attrs:{'__module__': '__main__', '__qualname__': 'World'},type:<class 'dict'>
==================================================
cls:<class '__main__.Base'>
name:User,type:<class 'str'>
bases:(<class '__main__.World'>,),type:<class 'tuple'>
attrs:{'__module__': '__main__', '__qualname__': 'User', 'say': <function User.say at 0x1091d4378>},type:<class 'dict'>
==================================================
--------------------------------------------------
Hello-type:<class 'type'>
World-type:<class '__main__.Base'>
"""
相关文章
相关标签/搜索