質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3772閲覧

__init__でクラスを削除したい

Third_Kei

総合スコア65

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/22 05:51

編集2021/06/22 06:17

前提・実現したいこと

クラスの初期処理に失敗したときにクラス自身を削除する、といったことがしたいです
仮コードで挙動を確認している最中に、想定と異なる挙動をしたので質問しました
実行していたのはpaiza.ioというサイトです

該当のソースコード

python

1class A(): 2 def __init__(self): 3 del self 4 def __del__(self): 5 print("deleted") 6 def __str__(self): 7 return "exist"

テストコードと出力

サイトの仕様で最後にインスタンスが削除されるのか、__init__からdelを取り除いてもdeletedと出力されます

a = A() print(a) =============== exist deleted
a = A() del a =============== deleted
a = A() print(a) print(a) =============== exist exist deleted

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kenji.Noguchi

2021/06/22 06:10

こういうことですかね?``` def __init__(self): cls = self.__class__ del cls ```
Third_Kei

2021/06/22 06:14

試してみましたが、ダメでした
Kenji.Noguchi

2021/06/22 06:21

ならtry: a=A(); except: del Aで良いのでは?特殊すぎて目的がよくわかりません。
quickquip

2021/06/22 07:10 編集

> クラスの初期処理に失敗したときにクラス自身を削除する は目的ではないはずです。 「実現したいこと」は他にあって、そのための手段の方かと思います。 そもそもの目的である「実現したいこと」の方を質問した方がよいですよ。
Third_Kei

2021/06/22 07:40

お二人ともありがとうございます リスト内法表記でインスタンスを生成する際、__init__で正常に生成できなかったインスタンスを削除したいのが目的でした __init__ほか、生成前後のプログラムを見直してみます ありがとうございました
quickquip

2021/06/22 07:49

> __init__で正常に生成できなかったインスタンスを削除したい なぜ? そんな突拍子もない(ように見える)ことをしたくなったんですか???????
quickquip

2021/06/22 07:55

↑のコメントは無視してください。申し訳ありません。
Third_Kei

2021/06/22 08:04

インスタンス生成時に、失敗しうる通信を行っているクラスがあり、失敗した場合にインスタンスを生成しないことはできないのだろうか →生成した直後に__init__で消せばよいのでは?(try-catch文の追加なので良くないことはわかってはいたのですがつい……) という考えです 通信の機構を別のメソッドに切り分けて対応しようと思っています
Kenji.Noguchi

2021/06/22 16:29

クラスを削除ではなくて、__init__に失敗したインスタンスを削除だったのですね。
guest

回答1

0

ベストアンサー

クラス自身を削除する、といったことがしたいです

できません。
「インスタンスを削除する」ことがそもそもPythonでは不可能です。

インスタンスがどこからも参照されなくなったら、その後のどこかのタイミングでガベージコレクションが削除してくれるのを期待するしかありません。

del文は、そのスコープの名前空間から名前を削除するための文です。それによって結果として、その名前を束縛していたインスタンスがどこからも参照されなくなった場合に限り、ガベージコレクションがどこかのタイミングでインスタンスを削除してくれるというだけです。

object.__del__はインスタンスがガベージコレクションによって削除される時に動くメソッドです。

投稿2021/06/22 06:25

編集2021/06/22 06:33
quickquip

総合スコア11029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2021/06/22 06:27

C/C++ API の方からなにかをする時は話が別だとは思います。この回答はPython言語から見た時の話です。
Third_Kei

2021/06/22 06:46

del selfはインスタンス自身に対してdel文を実行しようとして失敗した、という認識で大丈夫でしょうか? ともあれ、ありがとうございます。 別の方法を探してみます
quickquip

2021/06/22 07:06

del self はローカル変数を名前空間から消すだけです。失敗してません。
quickquip

2021/06/22 07:28 編集

ええとdel文は失敗してません。 del 名前 の文が「インスタンス自身に対して」何かをすると考えている質問者さんの認識が間違ってます。
quickquip

2021/06/22 07:28

という回答でした。
Third_Kei

2021/06/22 07:38

丁寧にありがとうございます、名前空間について調べてみます ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問