1.面向对象封装
@abstractmethod #虚函数方法 def forward(self, inputs: Dict[str,torch.Tensor]) -> Dict[str, torch.Tensor]: pass @property #get属性 def output_names(self): """Return the output names.""" return self._output_names @output_names.setter #set 属性 def output_names(self, value): """Set the output names.""" self._output_names = value
2.对metaclass的理解:
from abc import ABCMeta, abstractmethod
from typing import Dict, List, Sequence class BaseWrapper(torch.nn.Module, metaclass=ABCMeta):
3. 广泛应用Registry机制
4.对功能的整理,高模块化管理,显示导入,替代隐式导入
文件夹表示一个模块,用__init__.py做向外的直接接口提供
5.自定义一个上下文管理器类:也可以使用@contextmanager
class MyResource:
# __enter__ 返回的对象会被with语句中as后的变量接受
def __enter__(self):
print('connect to resource')
return self
def __exit__(self, exc_type, exc_value, tb):
print('close resource conection')
def query(self):
print('query data')
类中有两个特殊的魔术方法:
__enter__: with语句中的代码块执行前, 会执行__enter__, 返回的值将赋值给with句中as后的变量.
__exit__: with语句中的代码块执行结束或出错, 会执行_exit__
比如以下代码:
with Myresource() as r:
r.query()