CONFIG字典用法

CONFIG字典是manim的一个特性,方便了父子类之间参数的继承和修改

对于CONFIG字典的处理,在manimlib/utils/config_ops.py
它可以将CONFIG字典中的键值对转化为类的属性和值

一般在最底层的类(Container,Animation)中的__init__方法第一行会 调用这个函数digest_config(self, kwargs)将CONFIG字典和kwargs都转化为属性, 可以直接通过self.访问,简化了类之间继承的处理

下面是一个实例

manimlib/mobject/geometry.py中有很多类继承的关系

# 711行
class Polygon(VMobject):
    CONFIG = {
        "color": BLUE,
    }
# 813行
class Rectangle(Polygon):
    CONFIG = {
        "color": WHITE,
        "height": 2.0,
        "width": 4.0,
        "mark_paths_closed": True,
        "close_new_points": True,
    }

Polygon类通过在CONFIG字典中的键值对"color": BLUE,添加了self.color这个属性, 在父类VMobject中访问self.color对Polygon上色

同时Rectangle类在CONFIG字典中也含有键color,但值不同,此时会利用优先级将self.color这个属性修改为WHITE
而且还通过键值对"height": 2.0等设置了一些特有的属性,方便后面使用

CONFIG字典嵌套

CONFIG字典支持嵌套,即键的值也为一个字典,例如

class Camera(object):
    CONFIG = {
        "background_image": None,
        "pixel_height": DEFAULT_PIXEL_HEIGHT,
        "pixel_width": DEFAULT_PIXEL_WIDTH,
        "frame_rate": DEFAULT_FRAME_RATE,
        "frame_height": FRAME_HEIGHT,
        "frame_width": FRAME_WIDTH,
        "frame_center": ORIGIN,
        "background_color": BLACK,
        "background_opacity": 1,
        "max_allowable_norm": FRAME_WIDTH,
        "image_mode": "RGBA",
        "n_channels": 4,
        "pixel_array_dtype": 'uint8',
        "z_buff_func": lambda m: np.round(m.get_center()[2], 2),
        "cairo_line_width_multiple": 0.01,
    }
class Scene(Container):
    CONFIG = {
        "camera_class": Camera,
        "camera_config": {},
        "file_writer_config": {},
        "skip_animations": False,
        "always_update_mobjects": False,
        "random_seed": 0,
        "start_at_animation_number": None,
        "end_at_animation_number": None,
        "leave_progress_bars": False,
    }

    def __init__(self, **kwargs):
        Container.__init__(self, **kwargs)
        self.camera = self.camera_class(**self.camera_config)

Camera类的CONFIG字典含有很多键值对,而且Scene类中需要调用这个类, 为了更方便的控制,Scene类中有一个特殊的键值对"camera_config": {}, 它的值是一个字典,通过初始化Camera类的时候作为kwargs传入,修改Camera类的属性的值

所以CONFIG字典的嵌套 本质 上是将值作为kwargs传入

常见使用方法

在自己写类的时候,可以通过CONFIG来添加属性或者修改父类的属性

最常用的还是在编写Scene的时候,用来修改camera的属性

CONFIG = {
    "camera_config": {
        "background_color": WHITE,
    },
}

例如添加如上字典,更改背景颜色为白色,等等