object.__new__() のソース定義を確認したいので、この簡単な方法でそのコードにアクセスすることにしました。type:method だと教えてくれるのにTypeError (is not a type:method)
、なぜ python が私に を与えるのですか?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 のクラス メソッドの 1 つを呼び出すことができます。SadClass には __init__ があり、FunClass にはありません。問題が解決しました。