class 内的调度程序

Dispatcher inside a class

我有这段代码:

class InputLayer():
    def __init__(self):
        print('Test')

class Model():

    layer_type_map = {
        'input_layer': InputLayer
    }

    def __init__(self, architecture):

        for layer in architecture:

            layer_class = self.layer_type_map[list(layer.keys())[0]]
            layer_class()

我的问题是:在倒数第二行,为什么我需要输入 self.

我实例化为:

layer0 = {'input_layer': {'input_shape': input_shape}}
layer1 = {'fc_layer': {'num_nodes' : 5}}
layer2 = {'output_layer': {'num_outputs' : 10}}

architecture = [layer0, layer1, layer2]

mynet = Model(architecture)

如果我正确使用代码,layer_type_map[list(layer.keys())[0]]的值是InputLayer,但InputLayer不是Modelclass的方法。为什么这样做有效?

我是 classes 和对象方面的新手,但我想这是一种处理事物的方式 'Dispatcher'。我说得对吗?

My question is: in that penultimate line, why I need to put self.?

因为layer_type_mapModel的一个属性,所以需要在访问的时候引用它,通过Model的实例指定,通过使用self

If I use the code correctly, the value of layer_type_map[list(layer.keys())[0]] is InputLayer, but InputLayer is not a method of the Model class. Why does this work?

InputLayer不是Model的方法,而是在

中设置的
layer_type_map = {
    'input_layer': InputLayer
}

因为在倒数第二行,您调用了 self.layer_type_map[list(layer.keys())[0],您得到了 layer_type_map['input_layer'] 的值,即 class InputLayer。然后通过调用 layer_class()

实例化它

这就是您的代码有效的原因:D 我还没有尝试过,但这是我的简短解释。希望这有帮助

您需要在代码中使用 self,因为 layer_type_map 是一个 class 变量。我认为其余的代码只会让您感到困惑。您可以通过一个更简单的示例来演示 self 在这种情况下的用法:

class Foo:
    class_var = "a class variable"

    def method(self):
        print("accessing class_var via self works", self.class_var)
        print("so does accessing class_var via Foo", Foo.class_var)
        print("accessing class_var directly doesn't work", class_var) # raises an exception

instance = Foo()
instance.method()

您代码中的 self 用于查找 self.layer_type_map,这是一本字典。对字典进行的索引(最终得到 InputLayer)与首先发生的变量查找无关。在定义 class 时查找 InputLayer class(在全局命名空间中),并将对它的引用放入字典中。