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

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

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

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

Python

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

Q&A

解決済

2回答

8925閲覧

別のクラス間でインスタンス変数を共有したい

nkn__

総合スコア8

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2020/07/13 16:02

前提・実現したいこと

別のクラス間で、__init__()ではないdefで宣言したインスタンス変数を共有したいです。

該当のソースコード

Python

1class a(): 2 def __init__(self): 3 pass 4 5 def a1(self): 6 self.aInt = 5 7 print(b.bInt) #ここで Class b の bIntを参照したい 8 9class b(): 10 def __init__(self): 11 pass 12 13 def b1(self): 14 self.bInt = 10 15 print(a.aInt) #ここで Class a の aIntを参照したい 16 17 18ains = a() 19ains.a1() 20 21bins = b() 22bins.b1()

###エラーメッセージ

Traceback (most recent call last): File "<module1>", line 19, in <module> File "<module1>", line 7, in a1 AttributeError: type object 'b' has no attribute 'bInt'

当然ですがこのままだとAttributeErrorが出てしまいます。

###試したこと
デコレータが使えそうだと思いチュートリアルを読んでみましたが、いまいちピンとこず質問させていただきました。

補足情報

バージョンはPython 3.8
IDEはPyScripterです

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

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

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

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

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

shiracamus

2020/07/13 19:51

ains = a() bins = b() ains.a1() bins.b1() にするのはだめなのですか?
quickquip

2020/07/14 01:39

そうすることで解決したい問題の方を書くのがいいように思います。 「解決したい問題」に対して「間違った解決方法」を考えている雰囲気があります。
guest

回答2

0

ベストアンサー

いい例ではないかもしれませんが、クラス内関数でオブジェクトを引数にとり、オブジェクトに属性がない場合に発生する例外をトラップします。

class a(): def __init__(self): pass def a1(self, b): self.aInt = 5 try: print(b.bInt) except AttributeError: pass class b(): def __init__(self): pass def b1(self, a): self.bInt = 10 try: print(a.aInt) except AttributeError: pass ains = a() bins = b() ains.a1(bins) # この段階ではb.b1()が実行されておらずbIntがないためAttributeErrorとなりpassに飛ぶ bins.b1(ains) ains.a1(bins) #実行結果 >>> 5 >>> 10

投稿2020/07/13 16:43

patapi

総合スコア820

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

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

nkn__

2020/07/14 05:28

なるほど、その手がありましたか! 一時的に使えればよかったので助かりました…。 ありがとうございます。
guest

0

たとえば、次のようなことはできます:

python

1class a(): 2 aInt = 0 3 4 def __init__(self): 5 pass 6 7 def a1(self): 8 a.aInt += 5 9 print(b.bInt) #ここで Class b の bIntを参照したい 10 11class b(): 12 bInt = 0 13 14 def __init__(self): 15 pass 16 17 def b1(self): 18 b.bInt += 10 19 print(a.aInt) #ここで Class a の aIntを参照したい 20 21 22ains = a() 23ains.a1() 24 25bins = b() 26bins.b1() 27 28ains2 = a() 29ains2.a1() 30 31bins2 = b() 32bins.b1()

実行結果:

console

1$ python test.py 20 35 410 510

ただし、ご覧のとおり、aInt, bIntクラスプロパティとなり、
すべてのインスタンスで共有されます

self.aIntself.bInt という参照方法は
インスタンスプロパティを参照する方法ですので、
別のインスタンスのメソッド内で参照するためには、
引数でインスタンスを代入するなどの方法が必要です:

python

1 def a1(self, instance_b): 2 a.aInt += 5 3 print(instance_b.bInt)

投稿2020/07/13 16:39

y_shinoda

総合スコア3272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問