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
不是Model
class的方法。为什么这样做有效?
我是 classes 和对象方面的新手,但我想这是一种处理事物的方式 'Dispatcher'。我说得对吗?
My question is: in that penultimate line, why I need to put self.?
因为layer_type_map
是Model
的一个属性,所以需要在访问的时候引用它,通过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(在全局命名空间中),并将对它的引用放入字典中。
我有这段代码:
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
class的方法。为什么这样做有效?
我是 classes 和对象方面的新手,但我想这是一种处理事物的方式 'Dispatcher'。我说得对吗?
My question is: in that penultimate line, why I need to put self.?
因为layer_type_map
是Model
的一个属性,所以需要在访问的时候引用它,通过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(在全局命名空间中),并将对它的引用放入字典中。