【问题标题】:In python is there a reason to pass self to static method in a class?在 python 中,是否有理由将 self 传递给类中的静态方法?
【发布时间】:2020-03-03 13:44:09
【问题描述】:

我在 One-Class Neural Network 审查代码。

作者创建@staticmethod:

@staticmethod
def custom_ocnn_loss(self,nu, w, V):

但稍后在OC_NN fit 实例方法内部,使用类名访问它并传入self

model.compile(loss=OC_NN.custom_ocnn_loss(self,nu, w, V), optimizer=opt,metrics=None)

是否有这样做的理由(即创建@staticmethod,它将self 作为参数并使用类名在实例方法内部访问)?

【问题讨论】:

    标签: python instance-variables class-variables


    【解决方案1】:

    在脚本中,custom_ocnn_loss 函数有@staticmethod 装饰器,这意味着它不是实例方法而是静态方法。变量self 可能暗示不同,但是当调用custom_ocnn_loss 函数时,self 变量被传递给它。

    【讨论】:

    • 是的,你是对的 custom_ocnn_loss@staticmethod。但是,为什么要创建一个 @staticmethod 并以 self 作为参数?如果你希望类中的方法能够访问对象的实例,难道不直接使用实例方法吗?
    • 我尽力更新我的问题。我不清楚作者为什么会这样做,所以我很难描述。感谢您的回复。
    • 将变量命名为self 是违反约定的,并且非常具有误导性。我怀疑作者没有意识到这一点。
    • 这取决于您希望作为第一个参数传递的内容。仅仅因为参数名为 self 并不意味着您必须将“当前对象”作为参数传递。
    • 我认为以这种方式使用staticmethod 不是一个好习惯。从代码来看,可能他们原本打算让 custom_ocnn_loss 函数完全静态,不依赖实例属性,但在意识到需要r 后,他们迅速将self 添加到方法签名中作为事后诸葛亮。他们也可能打算将该函数用于具有r 属性的其他实例,但这是不好的做法。
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多