python Metaclass黑魔法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Metaclass黑魔法相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
这个C元类的功能就是在准备类的命名空间的时候,
将其父类的非私有成员(不以_开头的成员)添加到
这个命名空间中,然后在创建这个类的时候,再把父类的非私有成员给删除掉。
"""

import os


class C(type):
    @classmethod
    def __prepare__(metacls, name, bases, **kwds):
        d = dict()
        for base in bases:
            for key, value in base.__dict__.items():
                if not key.startswith('_'):
                    d[key] = value
        return d

    def __new__(cls, name, bases, namespace, **kwds):
        for base in bases:
            for key, value in base.__dict__.items():
                if not key.startswith('_'):
                    del namespace[key]

        return type.__new__(cls, name, bases, dict(namespace))


class Config(metaclass=C):
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))

class DeployConfig(Config):
    DATABASE = "time_log"
    DATA_DIR = os.path.join(BASE_DIR, "data")

print(DeployConfig.__dict__)
print(DeployConfig.DATA_DIR)

"""
  在这里,其实 DeployConfig 的命名空间中并没有 BASE_DIR ,
能够访问 BASE_DIR 是因为去访问它的父类的命名空间了。
"""
print(DeployConfig.BASE_DIR)

以上是关于python Metaclass黑魔法的主要内容,如果未能解决你的问题,请参考以下文章

陌生的 metaclass(转)

Python都有哪些黑魔法?

python 黑魔法收集

Python黑魔法

实战丨Python黑魔法之描述符

Python __super 黑魔法失败了