6

我想查看 object.__new__() 的源定义,并决定使用这种快速方式来访问该代码。为什么python给我一个TypeError (is not a type:method),什么时候type()告诉我这是一个类型:方法?

(1)
>>> import inspect
>>> print inspect.getsource(object.__new__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 701, in getsource
    lines, lnum = getsourcelines(object)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 690, in getsourcelines
    lines, lnum = findsource(object)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 526, in findsource
    file = getfile(object)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 420, in getfile
    'function, traceback, frame, or code object'.format(object))
TypeError: <built-in method __new__ of type object at 0x10a2d9410> is not a module, class, method, function, traceback, frame, or code object

>>> type(object.__new__)
<type 'builtin_function_or_method'>
>>>

我想首先查看定义的原因是因为我试图调用的方法需要一个特定类的实例作为它的第一个参数。

(2)
TypeError: unbound method getThings() must be called with FunClass instance as first argument (got SadClass instance instead)

还值得注意的是,FunClass 是 SadClass 的子类,正如错误消息所暗示的,我已经有了一个 SadClass 的实例。我觉得我有我需要调用的一切getThings(),但我想知道是否有一种聪明的方法来获取 FunClass 的实例,我可以用它来调用getThings()

我只想声明一个我需要的实例,但我遇到了麻烦,因为最终被调用的类和函数是基于我getattr()用来获取类对象(FunClass)的用户方法输入参数(字符串),和一个方法对象(getThings)。我创建 FunClass 实例的尝试在这里结束:

(3)
>>> ClassObject = getattr(FunClass,"FunClass")
>>> ClassObject
<class 'FunClass.FunClass'>
>>> ClassObject.__new__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object.__new__(): not enough arguments
>>>

最终,我只想能够调用 getThings,我想这需要一个 FunClass 的实例。我还有一个变量 ClassMethod,我尝试使用它来调用该方法。同样,我的类名和方法名以字符串形式出现,我使用 getattr() 来声明对象,如下所示:

(4)
>>> ClassMethod = getattr(FunClass, "getThings")
>>> ClassMethod
<unbound method FunClass.getThings>

当我打电话时ClassMethod(),我得到了(4)中看到的错误。我可能有不止一个问题,但任何方面的洞察力都会很棒!谢谢。

编辑:

(根据@nneonneo 的回答)

我最终做了:

ClassInstance = globals()["FunClass"](self.thing1, self.thing2)
ClassMethod = getattr(ClassInstance, "getThing")
ClassMethod() # to call the function

其中“FunClass”和“getThing”实际上是传递给函数的字符串,可以是任意数量的类/方法组合。Thing1 和 Thing2 需要在其他地方实例化父类 (SadClass),因此这允许我使用这些现有属性实例化其子类“FunClass”,然后调用 FunClass 的类方法之一。SadClass 有 __init__ 而 FunClass 没有。问题解决了。

4

2 回答 2

6

你为什么要直接打电话__new__?只需像这样创建一个新实例:

obj = FunClass()

或者,要使用动态名称,globals()['FunClass']().

然后你可以做

obj.getThings()

或者,动态地,getattr(obj, 'getThings')().

顺便说一句,你看不到它的来源,object.__new__因为它是一个内置方法(因此它是在较低级别实现的,例如 CPython 的 C)。

于 2013-04-09T05:15:01.257 回答
2

如果您出于某种原因确实需要__new__直接调用,而不仅仅是根据 nneonneo 的回答调用该类,您需要了解__new__- 无论出于何种原因 - 实际上不是 a classmethod,即使它具有 one 的签名,并且您需要显式传入类:

inst = ClassObject.__new__(ClassObject)

应该管用。但不要忘记调用类本身并不止于此——您可能还想通过调用inst.__init__().

于 2013-04-09T07:54:48.627 回答