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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

2回答

462閲覧

基本設定を指定したclassを継承して、設定の上書きと従属変数の自動更新を実現したい

MagMag

総合スコア80

Python

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

1グッド

0クリップ

投稿2022/09/14 06:59

編集2022/09/14 07:32

実現したいこと

テスト環境と本番環境など、実行状況に応じてファイルの保存先を変更したいと思っており(例えば、テスト環境とデフォルト環境で保存フォルダを変えたい)、classと継承を使って実装しようと思っています。

このとき、file_pathはsave_directoryに従属して決まるので、save_directoryが更新されたら自動的にfile_pathも更新したいと思っています。下の例で言えば、testconfig.file_pathが自動的にtest/result.txtになるようにしたいのですが、どのように実装したらいいでしょうか?

この方法に限らず、そもそもこういう方法を使った方がいい、というアドバイスでも助かります!

該当のソースコード

Python

1from dataclasses import dataclass 2 3@dataclass 4class BaseConfig(): 5 save_directory = 'default' 6 file_path = Path(save_directory, 'result.txt') 7 8class TestConfig(BaseConfig): 9 save_directory = 'test' 10 11 12testconfig = TestConfig() 13print(testconfig.save_directory) # 'test’であり想定通り 14print(testconfig.file_path) # default/result.txtとなるが、本当はtest/result.txtになってほしい。
int32_t👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

「プロパティ」として処理を定義すると受け取ることができるかと思います。

python

1from dataclasses import dataclass 2 3@dataclass 4class BaseConfig(): 5 save_directory: str = 'default' 6 # ↓「プロパティ」として処理を追加 7 @property 8 def file_path(self): 9 return Path(save_directory, 'result.txt') 10 11# ↓dataclassアノテーション追加 12@dataclass 13class TestConfig(BaseConfig): 14 save_directory: str = 'test' 15 16testconfig = TestConfig() 17print(testconfig.save_directory) # 'test’であり想定通り 18print(testconfig.file_path)

投稿2022/09/14 07:44

編集2022/09/14 07:45
Matsumon0104

総合スコア1005

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

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

MagMag

2022/09/15 00:52

ありがとうございます!ただ、実際はsave_directoryに従属するファイル名が10以上ある状態です(シンプルに質問書いたつもりですが、要件が正確でなく恐縮です)。 プロパティの使い方は初めて知ったのですが、更新したいfile_pathが複数あり、@propertyの関数を列挙することで可読性を下げたくない場合、file_pathをまとめて更新するメソッドを定義し、継承後のインスタンス(testconfig)を作った後にこのpath_reloaderを手動で呼び出す方法は思いついたのですが、これ以外の方法はあったりしますでしょうか?
Matsumon0104

2022/09/15 01:28 編集

要件がよくわからないので、なんとも言えませんが、ここまで伺った仕様でdataclassを利用するのであれば、継承しないで、そのままBaseConfigのコンストラクタに初期値を入れ込んであげて別インスタンスを作成するというのはダメなのでしょうか? @dataclass class BaseConfig(): save_directory: str = '' file_name: list = field(default_factory=list) @property def file_path(self): # ここは配列からパスを組み立てる処理に変更 return Path(save_directory, 'result.txt') baseconfig = BaseConfig(save_directory='dir', file_name=['a.txt', 'b.txt']) textconfig = BaseConfig(save_directory='test', file_name=['1.txt', '2.txt'])
MagMag

2022/09/16 01:07

おっしゃるとおり、継承にこだわらない方が今回の要件としてはいいかと思いました。アドバイスありがとうございます!
guest

0

file_pathを返す関数を@propertyで装飾すればよいかと思います。

Pytnon

1from dataclasses import dataclass 2from pathlib import Path 3 4@dataclass 5class BaseConfig(): 6 save_directory = 'default' 7 8 @property 9 def file_path(self): 10 return Path(self.save_directory, 'result.txt') 11 12class TestConfig(BaseConfig): 13 save_directory = 'test' 14 15for c in [BaseConfig(), TestConfig()]: 16 print(c.save_directory) 17 print(c.file_path) 18 19""" 20default 21default\result.txt 22test 23test\result.txt 24"""

投稿2022/09/14 07:36

編集2022/09/14 07:43
can110

総合スコア38266

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

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

MagMag

2022/09/15 00:52

(Matsumon0104さんへのコメントと同じコメントです) ありがとうございます!ただ、実際はsave_directoryに従属するファイル名が10以上ある状態です(シンプルに質問書いたつもりですが、要件が正確でなく恐縮です)。 プロパティの使い方は初めて知ったのですが、更新したいfile_pathが複数あり、@propertyの関数を列挙することで可読性を下げたくない場合、file_pathをまとめて更新するメソッドを定義し、継承後のインスタンス(testconfig)を作った後にこのpath_reloaderを手動で呼び出す方法は思いついたのですが、これ以外の方法はあったりしますでしょうか?
can110

2022/09/15 01:12

path_reloaderと同じ処理をsave_directoryのsetter関数を定義してやればよいかと思います。
MagMag

2022/09/16 01:07

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問