Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在本例中,我如何动态实例化(以字符串形式使用类名)要调用getThings()的类?_Python_Oop_Instantiation_Class Method - Fatal编程技术网

Python 在本例中,我如何动态实例化(以字符串形式使用类名)要调用getThings()的类?

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

我想查看对象的源定义。\uuuu new\uuuuu()并决定使用这种快速方式访问该代码。当
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)