コンストラクタは async,await を利用した非同期関数にできないので、それらを利用しようと思った場合、オブジェクトを作成して一連の作成時処理を呼び出した後そのオブジェクトを返すメンバを作る必要があります。
そこで、外部からコンストラクタを呼び出されてしまうと、実行してほしい処理が実行されなくて困るので、外部からの呼び出しを禁止する方法はありますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
コンストラクタは async,await を利用した非同期関数にできないので、
具体的なコードがないので、状況次第ですが
__await__
メソッドを実装するではだめですか?
オブジェクトをコルーチンとしてのように振る舞わせることは可能です。
python
1import asyncio 2 3class C: 4 def __init__(self): 5 print("init C") 6 self._coro = self._sleep() 7 8 def __del__(self): 9 print("del C") 10 11 def __await__(self): 12 return self._coro.__await__() 13 14 async def _sleep(self): 15 await asyncio.sleep(1) 16 17async def main(): 18 await C() # <--- コンストラクタに async,await は使えないが、 19 # __await__ を実装する事で、オブジェクト自身を awaitable に 20 print("DONE") 21 22 23if __name__ == "__main__": 24 asyncio.run(main())
投稿2020/12/18 00:57
編集2020/12/19 02:20総合スコア8729
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/18 03:36 編集
2020/12/18 05:21
2020/12/18 10:13
2020/12/19 01:49
2020/12/19 01:59 編集
2020/12/19 02:12
0
ベストアンサー
python
1class Foo(object): 2 def __init__(self): 3 raise NotImplementedError() 4 5 ''' 6 クラス共通の初期化処理が不要ならば下記関数は不要? 7 ''' 8 def __new__(cls): 9 bare_instance = object.__new__(cls) 10 # クラス共通の初期化処理を以下に書く 11 return bare_instance 12 13 @classmethod 14 def create(cls, value1, value2): 15 # 「オブジェクトを作成して」 16 self = cls.__new__(cls) 17 # 「一連の作成時処理を呼び出した後」 18 self.value1 = value1 19 self.value2 = value2 20 # 「そのオブジェクトを返す」 21 return self 22 23 def get_value1(self): 24 return self.value1 25 26 def get_value2(self): 27 return self.value2 28 29''' 30実行例 31''' 32 33f0 = Foo.create(0, 100) 34f1 = Foo.create(-10, -100) 35 36print(f0.get_value1()) 37print(f0.get_value2()) 38 39print(f1.get_value1()) 40print(f1.get_value2()) 41 42>> 0 43>> 100 44>> -10 45>> -100
g = Foo() >> NotImplementedError
注)この方法によってもFoo.__new__(Foo)
という呼び出し方はできてしまう。
投稿2020/12/17 10:57
編集2020/12/17 11:59総合スコア1137
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。