班级内的调度员

时间:2018-11-28 00:28:19

标签: python dispatcher

我有这段代码:

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不是Model类的方法。为什么这样做?

关于类和对象,我是新手,但是我想这是一种处理事情的方法,即“分派器”。我说的对吗?

2 个答案:

答案 0 :(得分:0)

  

我的问题是:在倒数第二行中,为什么我需要自我介绍??

由于layer_type_mapModel的属性,因此您需要在需要访问时引用它,方法是使用Model的实例指定它,并使用{{1} }

  

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

self不是InputLayer的方法,而是在

中设置
Model

由于倒数第二行中,您叫layer_type_map = { 'input_layer': InputLayer } ,所以得到了self.layer_type_map[list(layer.keys())[0]的值,即layer_type_map['input_layer']。然后,您通过调用class InputLayer

实例化它

这就是为什么您的代码有效的原因:D我还没有尝试过,但这是我的简要说明。希望有帮助

答案 1 :(得分:0)

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

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类,并将对它的引用放入字典中。