我正在用Python开发一个类,其中一个属性应该代表一个神经网络。我希望这个属性实际上是另一个类的一个实例,让我们用几种方法调用它NN
(比如train()
用于训练,predict()
用于预测等。 )。此外,我认为初始化此属性的合理方法是使用我的班级'构造函数,它期望NN
类的实例作为其参数之一。
我对如何解决这个问题的第一个想法是实现一个接口,然后键入检查用户提供给我的类构造函数的任何内容,以确保它来自预期的NN
类。但是,似乎接口(1)和类型检查(2,3,4,5)都不是Python中的好习惯。
相反,我们应该使用Duck typing,并且只是尝试使用对象方法,直到我们不能(即将类型检查推迟到运行时)。但是,在我的情况下,NN
类可能非常复杂,有几个方法和属性。如果我放弃了界面的想法,并且只是希望我的类的用户提供一个具有所有必要方法和属性的对象,他/她将如何知道对象的期望是什么?我应该在我的类docstring,构造函数docstring或其他地方写下所有这些信息吗?或者有更好的方法来解决这种情况吗?
答案 0 :(得分:1)
我会说__init__
docstring是你要放入的地方,因为那是提供NN对象的地方。
类似的东西:
"""
(...)
:param NN: an object supporting run(), train() and validate() methods
(...)
"""
这里的优点是你可以提供任何作为参数 - 你可以编写一个NN参数,它甚至不是一个类而是一个函数,或一个内置的修改后的实例,或者其他像这样疯狂的东西 - 只要用户提供正确运行的东西,它就会起作用作为你的神经网络。
答案 1 :(得分:0)
从Python 3.5开始,您可以使用type hints。这会向用户记录预期的类型,并启用可选的离线类型检查。