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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

346閲覧

動的にクラスを生成して呼び出す方法

hakoritenshi

総合スコア41

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2022/09/29 12:59

前提

初心者で大変恐縮です。

頑張ってクラスの勉強中です。
以下のプラグラムは、太郎と花子の点数合計をするプログラムです。

太郎用のインスタンス(taro)
花子用のインスタンス(hanako)
を生成して、それぞれのインスタンスを呼び出せば
それぞれの点数合計を出すことは出来ました。

同じgokei変数名でもインスタンスは別々のメモリ空間にいるため
干渉しあわないものなのだと理解致しました。
また、インスタンス側で変数を保持できるものだと理解できました。

ただし、太郎用のインスタンス、花子用のインスタンスのように
静的に書き分けをしなければならないのが微妙だな感じています。

現在のプログラム

python

1class Tokuten_data: 2 def __init__(self): 3 self.gokei = 0 4 5 def gokei_cal(self, name, ten): 6 self.gokei = self.gokei + ten 7 print(f"{name}: {self.gokei}") 8 return(self.gokei) 9 10taro = Tokuten_data() 11hanako = Tokuten_data() 12 13name = "taro" 14ten = 50 15taro.gokei_cal(name, ten) 16 17name = "taro" 18ten = 45 19taro.gokei_cal(name, ten) 20 21name = "hanako" 22ten = 90 23hanako.gokei_cal(name, ten) 24 25name = "hanako" 26ten = 85 27hanako.gokei_cal(name, ten)

実現したいこと

dictのnameから動的に「taro」「hanako」クラスを作成して、処理を行うのようなことは出来ますでしょうか?

python

1class Tokuten_data: 2 def __init__(self): 3 self.gokei = 0 4 5 def gokei_cal(self, name, ten): 6 self.gokei = self.gokei + ten 7 print(f"{name}: {self.gokei}") 8 return(self.gokei) 9 10# ----------------------------------------------- 11# 動的にクラスを生成して加算 12# ----------------------------------------------- 13dict = [ 14 { 15 "name": "taro", 16 "ten": 50 17 }, 18 { 19 "name": "hanako", 20 "ten": 90 21 }, 22 { 23 "name": "taro", 24 "ten": 45 25 }, 26 { 27 "name": "hanako", 28 "ten": 85 29 } 30]

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラスではなくインスタンスを自動生成するのではありませんか?
name毎にまとめてインスタンス生成すればいいと思います。

py

1class Tokuten_data: 2 def __init__(self, name): 3 self.name = name 4 self.gokei = 0 5 6 def gokei_cal(self, ten): 7 self.gokei = self.gokei + ten 8 print(f"{self.name}: {self.gokei}") 9 return(self.gokei) 10 11 def __repr__(self): 12 return f"<Tokuten_data: name={repr(self.name)}, gokei={self.gokei}>" 13 14# ----------------------------------------------- 15# 動的にクラスを生成して加算 16# ----------------------------------------------- 17data = [ 18 { 19 "name": "taro", 20 "ten": 50 21 }, 22 { 23 "name": "hanako", 24 "ten": 90 25 }, 26 { 27 "name": "taro", 28 "ten": 45 29 }, 30 { 31 "name": "hanako", 32 "ten": 85 33 } 34] 35 36people = {} 37for person in data: 38 name, ten = person["name"], person["ten"] 39 if name not in people: 40 people[name] = Tokuten_data(name) 41 people[name].gokei_cal(ten) 42print(people)

text:実行結果

1taro: 50 2hanako: 90 3taro: 95 4hanako: 175 5{'taro': <Tokuten_data: name='taro', gokei=95>, 'hanako': <Tokuten_data: name='hanako', gokei=175>}

投稿2022/09/29 13:14

編集2022/09/29 13:29
shiracamus

総合スコア5406

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

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

hakoritenshi

2022/09/29 13:44

people = {} people[name] = Tokuten_data(name) のようにインスタンス化出来ることを初めて知りました。大変勉強になりました。 自分なりに作成したプログラムは以下です。 もっと綺麗に簡潔に作成できるように勉強します。 ``` names = [ person['name'] for person in data ] uniq_names = set(names) people = {} for name in uniq_names: people[name] = Tokuten_data(name) for data_line in data: name = data_line['name'] ten = data_line['ten'] people[name].gokei_cal(ten) ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問