【问题标题】:Can a method be used as either a staticmethod or instance method?方法可以用作静态方法或实例方法吗?
【发布时间】:2011-04-28 01:17:34
【问题描述】:

我希望能够做到这一点:

class A(object):
    @staticandinstancemethod
    def B(self=None, x, y):
        print self is None and "static" or "instance"

A.B(1,2)
A().B(1,2)

这似乎是一个应该有一个简单解决方案的问题,但我想不出也找不到。

【问题讨论】:

  • 你为什么要这个?看起来很混乱。
  • 获取用于创建或编辑类的表单。静态方法将返回一个空白,而实例方法将返回填充了实例数据的相同内容。
  • @Jake:这听起来是个坏主意。通常我们在构造函数中有一套完整的默认值。一个空的构造函数构建空白表单。具有实际值的构造函数将使用数据填充表单。
  • 为什么模型可能负责视图?
  • 不,这不管用。

标签: python static-methods descriptor instance-methods


【解决方案1】:

这是可能的,但请不要。我还是忍不住实现了它:

class staticandinstancemethod(object):
     def __init__(self, f):
          self.f = f

     def __get__(self, obj, klass=None):
          def newfunc(*args, **kw):
               return self.f(obj, *args, **kw)
          return newfunc

...及其用途:

>>> class A(object):
...     @staticandinstancemethod
...     def B(self, x, y):
...         print self is None and "static" or "instance"

>>> A.B(1,2)
static
>>> A().B(1,2)
instance

邪恶!

【讨论】:

  • 太棒了! 。现在鲨鱼只需要激光束。
  • 谢谢。我自己也想到了类似的东西,但实际上最好使用它,因此我的问题在这里。
  • 我意识到这有点老了,但仍然:为什么我不应该使用它?我的意图是编写一个带有info() 方法的类,该方法返回允许过滤相同父类型的多个类的信息。它在初始化时进一步支持不同的配置,因此一旦初始化info() 方法将能够返回更详细的信息。我考虑了一段时间,也考虑过使用不同的方法,但这似乎使事情变得比必要的复杂(对用户而言)。
【解决方案2】:

由于您无论如何都希望使用静态方法案例来创建新类,因此您最好将其设为普通方法并在__init__ 方法的末尾调用它。

或者,如果您不希望这样做,请在类外部创建一个单独的工厂函数,该函数将实例化一个新的空对象,并在其上调用所需的方法。

可能有一些方法可以完全满足您的要求,但它们会在 Python 的内部机制中徘徊,令人困惑,在 python 2.x 和 3.x 之间不兼容 - 我看不出真正的需要为了它。

【讨论】:

    【解决方案3】:

    根据您的说法,这是否符合您的要求? 我不确定有没有办法完全按照你所说的“内置”

    class Foo(object):
        def __init__(self, a=None, b=None):
            self.a
            self.b
    
        def Foo(self):
            if self.a is None and self.b is None:
                form = CreationForm()
            else: 
                form = EditingForm()
            return form
    

    【讨论】:

      【解决方案4】:

      你的问题的答案是,你不能那样做。

      由于 Python 也支持常规函数,我要做的是在该类之外定义一个函数,然后从常规方法调用该函数。调用者可以决定需要哪一个。

      【讨论】:

      • “不要那样做,因为……”比说谎更有力量,也不会适得其反。
      • @Keith:忽略“方法可以用作静态方法或实例方法吗?”对您有多大帮助?并专注于“self=None”来证明一个答案的合理性,如果你最初的意思是“self=None”问题,那是故意误导。
      • @Keith:您可以通过获取有关他们(认为他们)为什么需要它的更多信息或“不要这样做,因为......”而不是“你不能那样做。”如果你看不到这一点,那么我看不出有什么好去处。
      • @Keith:“你不能那样做”是错误的。被告知这是错误的并且仍然声称它是真实的(请参阅此处的前两个 cmets)是在撒谎。如果您的意思是“不能这样做”的“self = None”语法,那么除了您故意误导之外,我看不到其他任何东西,因为这是OP想要做的一个例子,而不是被他们想要使用的确切语法。
      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多