🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

3回答

1285閲覧

Pythonで別のファイルに書いたクラスの中から、メインフォルダに書かれたクラス内の関数を使いたい

tam1006

総合スコア28

Python

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

0グッド

0クリップ

投稿2021/03/12 11:25

編集2021/03/12 11:42

前提・実現したいこと

よく目的別にクラスを分けて、別のファイルにして、そのファイルから目的の関数を呼び出してmainを書くということをすると思います。ここではそのクラスをAとして、メインでAを呼び出すこととします。
この時、Aのクラス内の処理で、メインのクラス変数に応じて処理を分けたいということがある場合、どうすればいいんでしょうか。

普通にメインでAのクラスをインポートする場合、メインはAのクラスを自由に使えますが、Aではメインのクラスにアクセスできないと思います。

例えば以下のAとmainコードがあったとして、mainはAのクラスを継承しています。ここで、Aのtest1クラスにおいて、mainのtest2クラスの中のクラス変数であるself.yearを用いたい場合、どうやって呼び出したらいいのですか?

python

1# A 2class test1: 3 def __init__(self): 4 self.name = "taro"

python

1# main 2from A import test1 3class test2(test1): 4 def __init__(self): 5 super().__init__() 6 self.year = 20

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

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

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

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

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

guest

回答3

0

y_waiwaiさんの言うとおり普通にできます。
しかし、いくつか間違いがあるので注意しましょう。

まず、self.yearはクラス変数ではなくインスタンス変数です。
次に、クラスを作る場合、名前や年齢を指定してインスタンスを作るようにするのが普通です。そうでないと20歳のtaroしか作れなくてクラスを作る意味がありません。

まず、tam1006さんのコードに少々手を加えたものです。

python

1# A 2class test1: 3 def __init__(self): 4 self.name = "taro" 5 def show_name(self): 6 print(self.name) 7 def show_year(self): 8 print(self.year)

python

1# main 2from A import test1 3class test2(test1): 4 def __init__(self): 5 super().__init__() 6 self.year = 20 7 8hanako = test2() 9hanako.show_name() 10hanako.show_year()

実行結果です。

shell

1> python main.py 2taro 320

次に、もう少し普通の使い方です。

python

1# A 2class test1: 3 def __init__(self, name): 4 self.name = name 5 def show_name(self): 6 print(self.name) 7 def show_year(self): 8 print(self.year)

python

1# main 2from A import test1 3class test2(test1): 4 def __init__(self, name, year): 5 super().__init__(name) 6 self.year = year 7 8hanako = test2('hanako', 30) 9hanako.show_name() 10hanako.show_year()

実行結果です。

shell

1> python main.py 2hanako 330

投稿2021/03/12 12:13

ppaul

総合スコア24670

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

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

0

単純な回答はy_waiwaiさんのものとppaulさんのものと同じく

普通に属性でアクセスできる

の一言で済ませてしまいたくなるところですが、しかし、指摘するべきこの質問のおかしなところは質問の3文目にあると思います。

Aのクラス内の処理で、メインのクラス変数に応じて処理を分けたいということがある場合、どうすればいいんでしょうか。

ここです。

1文目で質問者さんが書かれているとおり、巨大なプログラムを人間が把握するのはは難しいので、機能や目的を分割してそれらをクラスに書き出したりモジュールに分割したりして見通しをよくします。
その過程で3文目のようなことをやる必要があると気づいた時点で、「自分はクラスやモジュールを適切に分割することに失敗している」と、「クラスやモジュールの設計を間違えた」と、プログラマは認識するべきなのです。

その認識に至らず「どうすれば実現できるのか?」と考え質問していることが、そしてその質問に直截に回答してしまうことが混乱を産んでいるのではないかと思います。

(直截の回答を書こうとすると、どうしても「動きはすれど普通なら絶対のこんなコードは書かない」という例にしかならなかったので、一段メタな回答にしました)

投稿2021/03/12 15:40

編集2021/03/12 15:55
quickquip

総合スコア11231

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

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

0

Aではメインのクラスにアクセスできないと思います。

ふつーにできますよ。

投稿2021/03/12 11:35

y_waiwai

総合スコア88038

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

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

tam1006

2021/03/12 11:42

すみません、質問を更新したので、この場合どうしたらいいか教えてもらえますか?
y_waiwai

2021/03/12 11:47

ふつーのクラスとまったく変わりません test2クラスのインスタンスを作成すれば、インスタンス.year がアクセスできます
tam1006

2021/03/12 12:17

そもそもインポートできません。 ImportError: cannot import name "test2" となります。 Aでtest2をインポートしなければ、インポートエラーは表示されません
y_waiwai

2021/03/12 12:22

いわゆる循環参照ってやつですね。 それはもともとのコードが間違ってるからでているだけで、メインフォルダがどーとかは全く関係ないです。 ふつーに、他のフォルダでもでるエラーです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問