【问题标题】:Calling a static method inside a class in python在python中调用类中的静态方法
【发布时间】:2017-09-22 13:20:01
【问题描述】:

我遇到了一种情况,我从另一个静态方法调用一个类的静态方法。可以肯定的是,我没有问 X-Y 问题,我想提供一些背景知识。

我有一个类,它包含一个数据容器和几个在容器内转换数据的方法。因为我还希望转换器可以在没有类实例的情况下从外部调用,所以我选择静态方法:

class SomeClass(object):

  def __init__(self,some_data):
    self.data = some_data

  @staticmethod
  def convert_1(data_item):
    return 1+data_item

  @staticmethod
  def convert_2(data_item):
    return 2*data_item

现在我可以执行SomeClass.convert_1(data_item) 而无需创建SomeClass 的实例。

比方说,我想在SomeClass 内部有一个方法,它会依次进行两次转换,并且还希望将该方法作为静态方法。

可以吗

@staticmethod
def combined_convert(data_item):
  data_item = SomeClass.convert_1(data_item)
  data_item = SomeClass.convert_2(data_item)
  return data_item

SomeClass 里面?这感觉不对,因为我在其自己的定义中调用该类,但我无法想出另一种“更 Pythonic”的方式。

【问题讨论】:

  • 类是由你执行combined_convert的时间定义的,所以没有问题。
  • 你总是从方法中引用类的instances(使用self);为什么引用类是个问题?它只是 class 语句中的顶级代码,不能引用正在构建的类。
  • 您是否尝试过在模块中使用顶级函数?看起来您正在尝试使用类进行命名空间
  • @Felk 实际上是的。将静态方法分解为顶级函数将是一种解决方案。我觉得,这更多的是一种设计选择。还是有更多注意事项?
  • 为此使用模块只是惯用的python。在类中使用静态方法通常只是更多的类型化并且没有任何好处,除非它是一个工厂方法。

标签: python class static-methods


【解决方案1】:

你可以创建一个类方法。

@classmethod
def combined_convert(cls,data_item):
    data_item = cls.convert_1(data_item)
    data_item = cls.convert_2(data_item)
    return data_item

【讨论】:

  • 我觉得这是错误的,因为我不能在不传递实例的情况下从外部调用这个方法,或者我可以吗?
  • 可以在没有实例的情况下调用外部方法
  • 如果您访问类本身并希望能够更轻松地重构代码,这是要走的路,因为@classmethod-decorated 方法是静态的,但会自动将类传递为第一个参数,然后可以使用它而不是重复类名。但是,如果您想要一个纯静态方法,则有 @staticmethod,它本身不注入任何参数
猜你喜欢
  • 1970-01-01
  • 2022-12-22
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2015-09-15
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多