Python 在本例中,我如何动态实例化(以字符串形式使用类名)要调用getThings()的类?
我想查看对象的源定义。\uuuu new\uuuuu()并决定使用这种快速方式访问该代码。当Python 在本例中,我如何动态实例化(以字符串形式使用类名)要调用getThings()的类?,python,oop,instantiation,class-method,Python,Oop,Instantiation,Class Method,我想查看对象的源定义。\uuuu new\uuuuu()并决定使用这种快速方式访问该代码。当type()告诉我它是一个type:method时,为什么python会给我一个TypeError(不是类型:方法) (1) >>> import inspect >>> print inspect.getsource(object.__new__) Traceback (most recent call last): File "<stdin>", l
type()
告诉我它是一个type:method时,为什么python会给我一个TypeError(不是类型:方法)
(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'>
>>>
还值得注意的是,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
>>>
其中“FunClass”和“getThing”实际上是传递到函数中的字符串,可以是任意数量的类/方法组合。Thing1和Thing2是在其他地方实例化父类(SadClass)所必需的,因此这允许我使用这些现有属性实例化其子类“FunClass”,然后调用FunClass的一个类方法。SadClass具有uuu init_uuuuu,而FunClass没有。问题解决了 你为什么直接打电话给
\uuuuu new\uuuu
?只需创建一个新实例,如下所示:
(4)
>>> ClassMethod = getattr(FunClass, "getThings")
>>> ClassMethod
<unbound method FunClass.getThings>
obj = FunClass()
或者,要使用动态名称,globals()['FunClass']()
那你就做吧
obj.getThings()
或者,动态地,getattr(obj,'getThings')()
顺便说一句,你看不到对象的源代码。因为它是一个内置的方法(因此它是在较低的级别实现的,例如C代表CPython)。如果你真的因为某种原因需要直接调用\uuuunew\uuu
,而不是仅仅根据NNEO的答案调用类,您需要了解,无论出于何种原因,\uuuu new\uuu
实际上不是一个类方法,即使它有一个签名,并且您需要显式地传入类:
inst = ClassObject.__new__(ClassObject)
应该有用。但是别忘了调用类本身并不止于此——您可能还想通过调用inst.\uuuu init\uuuu()
globals()思想来完成剩下的工作!谢谢它允许我使用动态类名,这正是我所需要的。如果可以,我会投赞成票。谢谢
obj.getThings()
inst = ClassObject.__new__(ClassObject)