小编Yng*_*Moe的帖子

需要python字典表现得像deque(有最大长度)

有没有内置(或非常简单)的方法让python字典以与deque类似的方式工作.

我需要它具有最大大小,并且当添加新密钥时,如果达到最大长度,则删除首先添加的密钥.作为自定义类实现起来应该不会太难,但总是首选使用内置类.

我正在使用Python 3.6,如果有任何帮助.

python python-3.6

4
推荐指数
2
解决办法
721
查看次数

注册所有子类的最佳方式

我目前正在开发一个软件,其中我有从字典生成的类实例。这些字典文件的结构方式如下:

layer_dict = {
    "layer_type": "Conv2D",
    "name": "conv1",
    "kernel_size": 3,
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,运行以下代码

def create_layer(layer_dict):
    LayerType = getattr(layers, layer_dict['layer_type']
    del layer_dict['layer_type']
    return LayerType(**layer_dict)
Run Code Online (Sandbox Code Playgroud)

现在,我想支持创建新的图层类型(通过对BaseLayer类进行子类化)。我已经想到了几种方法来做到这一点,并认为我会问哪种方法最好,为什么我没有太多开发软件的经验(在 comp bio 中完成硕士学位)。

方法1:元类 我想到的第一个方法是有一个元类,它注册BaseLayer一个dict中的每个子类,并对该dict做一个简单的查找,而不是使用getattr。

class MetaLayer(type)
    layers = {}
    def __init__(cls, name, bases, dct):
        if name in MetaLayer.layers:
            raise ValueError('Cannot have more than one layer with the same name')
        MetaLayer.layers[name] = cls
Run Code Online (Sandbox Code Playgroud)

好处:元类可以确保没有两个类具有相同的名称。在创建新层时,用户不需要考虑除子类之外的任何事情。
缺点:元类难以理解并且经常被人反对

方法二:遍历__subclasses__

我想到的第二种方法是使用__subclassess__of的函数BaseLayer来获取所有子类的列表,然后使用Layer.__name__as 键和Layer值创建一个 dict 。请参阅下面的示例代码: …

metaclass class subclass decorator python-3.x

3
推荐指数
2
解决办法
1365
查看次数

标签 统计

class ×1

decorator ×1

metaclass ×1

python ×1

python-3.6 ×1

python-3.x ×1

subclass ×1