我想查看 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 没有。问题解决了。