【问题标题】:Can we ever call foo in this python class declaration? [duplicate]我们可以在这个 python 类声明中调用 foo 吗? [复制]
【发布时间】:2012-12-17 15:01:08
【问题描述】:

可能重复:
Class method differences in Python: bound, unbound and static

class A:
    def foo():
        print 'hello world'
    def foo1(self):
        self.foo()

a = A()
a.foo1()

我正在考虑使用该类私有的一些函数。我想唯一的办法就是按照惯例:在该函数名前面加上一个“_”前缀,并且第一个参数仍然是self

但是foo() 完全没用吗?

【问题讨论】:

  • 您可以使用a.foo.im_func 从绑定方法中取出函数——但正确的做法是使其成为@staticmethod

标签: python class methods


【解决方案1】:

对于所有重要的用途,是的。您可以通过方法上的各种属性获取原始函数,但在类中包含类似的东西仍然没有什么意义。

>>> A.foo.im_func()
hello world

【讨论】:

    【解决方案2】:

    是的,它几乎没用。在 Python 2.x 中,调用它而不抛出异常的唯一方法是从类的内部提取函数,然后调用它。在 Python 3.x 中(假设您转换了 print),您可以直接调用 A.foo()

    如果foo() 真的不需要self 参数,那么它就不需要是方法:只需将其作为定义类的同一模块中的函数即可。

    【讨论】:

      【解决方案3】:

      尝试拨打A.foo()。它将输出'hello world'

      请注意,这仅适用于 Python 3,因为在 Python 2 中它会引发 TypeError

      【讨论】:

      • 哦,不会的。 TypeError: unbound method foo() must be called with A instance...等
      • 好吧,它在 Python 3 中绝对有效,因为我自己尝试过
      • 是的,但首先您必须将print 语句更改为一个函数,因此发布的代码将不起作用。
      • 是的,你的回答基本概括了
      • 很好看的 Duncan :) 无论如何,看起来像是另一个 Q 的骗子,但也许有人想在那个 Q 上添加一些 Python 3 注释......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 2013-05-03
      • 2022-01-09
      • 2020-07-27
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      相关资源
      最近更新 更多