关于类:无法访问python函数作为属性

Can't access Python function as attribute

假设我有以下test.py文件

1
2
3
4
import foo

class example1(object):
      MyFunc = foo.func

Po.Py在哪里

1
2
def func():
      return 'Hi'

然后我写另一个文件

1
2
3
import test

test.example1.MyFunc()

并获取错误"unbound method func()必须以example1实例作为第一个参数调用(改为什么都没有)"。

如何使用函数func作为类example1的属性?


您的问题是一个特定于python 2的问题。在python 3中,不推荐使用unbound method类型。所以您的代码对于python 3是可以的。这里有一个很好的答案:函数、未绑定方法和绑定方法之间的区别是什么?在python 2中调用未绑定的方法将需要相应类类型的实例。

这里有一些解决方案。另一个是,您可以这样定义函数:

1
2
def func(object):
    return"Hi"

因为这是以对象为第一个参数。现在您可以编写此代码:

1
test.example1().MyFunc()

这是一个Python问题。将test.py改为以下,即可工作。

1
2
3
4
import foo

class example1(object):
    MyFunc = staticmethod(foo.func)

请注意,如果按照您所展示的方式保留test.py,则以下操作有效:

1
test.example1.__dict__['MyFunc']()

这与在Python中访问函数属性的方式有关。如果您感到好奇,请查看描述符。

这是一个相关的问题。另一个

这个问题的技术性在这里得到了发展。


在python 2.7中,以下内容适用于我:

类定义中缺少__init__()方法。

foo.py的定义如下:

1
2
def func():
      return 'Hi'

该类应定义如下:

1
2
3
4
5
import foo

class example1():
    def __init__(self):
        self.MyFunc = foo.func

然后,当您想要从类中调用属性时,您应该先实例化它。tester.py脚本应该如下所示,例如:

1
2
3
4
5
6
import tester

testerInstance = tester.example1()

testerAttribute = testerInstance.MyFunc()
print testerAttribute