したがって、人々が忘れがちな(または決して学習しない)ことの1つは、関数にも属性があり、それらは完全に変更可能であるということです。だからあなたはすることができます:
def LoadMyDLL():
dll = ctypes.CDLL("libmydll.so")
dll.HelperFunction = HelperFunction
dll.HelperFunction.dll = dll
return dll
しかし、これは問題を引き起こします:dll.HelperFunction.dll is HelperFunction.dll
。したがって、最後の呼び出しが何であれ、にアタッチされているオブジェクトにLoadMyDLL
なります。のコンテキスト外でHelperFunctionを使用していない場合は、次のことを行うことをお勧めします。の属性を作成せず、必要な場所で呼び出すだけです。Pythonは参照渡しであるため、変更する場合は変更します。私を信じていないのにサンプルコードを投稿してほしい場合は、イラストを使って編集させていただきます。CDLL
HelperFunction
dll.HelperFunction()
HelperFunc
dll
HelperFunction(dll)
dll
免責事項一般的に、あなたがしているように見えることは、私にはまったく正しく見えません。このようなことをしたい場合は、CDLL
オブジェクトをとして格納するクラスを作成し、そのクラスにメソッドをself.dll
作成することをお勧めします。次に、そのメソッドからHelperFunction
アクセスできます。self.dll
もちろん、デザインはあなたの決定であり、コードの残りの部分を見ることができませんが、後者は私にはもっと自然に思えます(そして私の推測では、他の多くの人にもそうでしょう)。
編集以下の議論のために、私が提案したクラスを構築することをどのように考えるかについてのアイデアを提供したいと思います(上記はそのまま受け入れられましたが)。
class DLLHelper(object):
def __init__(self, static_object=None, helper_function=None):
self.dll = ctypes.CDLL(static_object or "libmydll.so")
def HelperFunction(self):
# do stuff with self.dll
def OtherRelatedFunction(self):
# do stuff with self.dll and self.HelperFunction
dll = DLLHelper()
dll.HelperFunction()