Day 3
面向对象
预计阅读时间:30 分钟
¶关于本章
本章「面向对象」将介绍 Python 的面向对象编程(OOP)特性,包括类、对象、继承、多态等。
作用域与命名空间¶
跳过此节
如果你能直接完成下面的小测,可以跳过此节。
小测:作用域与命名空间
请问,以下代码的输出是什么?
x = 10
def foo() -> None:
x = 20
print(x, end=' ')
foo()
print(x)
类与对象¶
小测:类与对象
下面是(伪)多层感知机模型 MLP 的定义。
class MLP:
def __init__(self,
input_size: int = 784,
hidden_size: int = 256,
output_size: int = 10
) -> None:
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.init_weights()
def init_weights(self) -> None:
self.weights = [
[[0] * self.hidden_size] * self.input_size,
[[0] * self.output_size] * self.hidden_size
]
def forward(self, x) -> None:
pass
model = MLP(hidden_size=512)
请问,model.weights 的形状是什么?即 len(model.weights[0]),len(model.weights[0][0]),len(model.weights[1]),len(model.weights[1][0]) 分别是多少?
继承与多态¶
小测:继承与多态
下面是(伪)模型基类 Model 和(伪)多层感知机模型 MLP 的定义。
class Model:
def __init__(self, input_size: int, output_size: int) -> None:
self.input_size = input_size
self.output_size = output_size
def init_weights(self) -> None:
self.weights = []
def get_weights(self) -> list:
return self.weights
def forward(self, x) -> None:
pass
class MLP(Model):
def __init__(self,
input_size: int = 784,
hidden_size: int = 256,
output_size: int = 10
) -> None:
super().__init__(input_size=input_size, output_size=output_size)
self.hidden_size = hidden_size
self.init_weights()
def init_weights(self) -> None:
self.weights = [
[[0] * self.hidden_size] * self.input_size,
[[0] * self.output_size] * self.hidden_size
]
def forward(self, x) -> None:
pass
请问,以下代码的输出是什么?
model = MLP(hidden_size=1024)
print(model.get_weights())