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

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

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

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

2回答

2397閲覧

Python:他のクラス内容を変更したい

sponge_yukari

総合スコア12

Python 3.x

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2018/11/09 07:16

こんにちわ。
初歩的な部分な気がするのですが、たどり着けないので質問します。


環境

  • Python 3.6
  • (PyQt5)

やりたいこと

ファイルが3つあります。
main.py、A.py、B.py

mainでAとBを使います。

Python

1from . import A 2class main: 3 AA = A.Aclass() 4 BB = B.Bclass() 5 def print_a(self): 6 print(self.AA.a)

Aで使っているaという変数があります。
これをmainから参照しています。

Python

1class Aclass: 2 a = "a"

aを、Bから変更したいです。
変更するのはmainで使用しているaと同じオブジェクト(同じID)です。
Bからaを変更すれば、mainでprint()等した際にちゃんと変更されている状態を目指してます。

試したこと

Python

1class Aclass: 2 a = "a" 3 def set_a(self, value): 4 global a 5 self.a = value

これでaの共有ができないかと考えたのですが、B側でAのインスタンスを作っても同じIDにはならなかったので、うまくいきませんでした。

条件

その他

PyQt5で画面を作成しています。
その際、プログレスバーをダイアログ画面で表示して、その中に1つのラベルとプログレスバーを表示します。
ラベルには、現在の作業内容を表示します。
作業は、関数内で行います。
ラベル内容の変更は、その処理の関数の行に入る直前に変更します。
処理をクラスごとに分ける関係で、プログレスバーの画面を表示・実行した場所とは別のクラス(ファイル)でラベルの変更を行うこともあります。

このパターンを行う際に、今回の質問内容がほしくなりました。
サンプルが用意できなかったことと、変数の共有等の初歩的な可能性が高いと思い、今回はこのような形の質問方法にしました。


Javaの場合、static等を使えば似たようなことができたと思うのですが、Pythonでは再現できないということでしょうか。

以上です

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

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

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

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

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

guest

回答2

0

python

1class Aclass: 2 a = "a" 3 def set_a(self, value): 4 global a 5 self.a = value

ちょっとpython的には残念なコードになっています。コードを見るとJavaとかに慣れている人なのかな? という気がしますが、pythonのオブジェクト指向は少しスタイルが違うので注意しましょう。

python

1# globalというのはここの名前空間のこと 2# a = "hoge" 3 4class Aclass: 5 a = "a" # ここに書くとクラス変数になる。 6 def set_a(self, value): 7 global a # globalはクラス変数ではない 8 self.a = value # self.a = valueではインスタンス変数にアクセスしてaというインスタンス変数を作成する

今回はインスタンス変数にしたいのだと思うので、コンストラクタの__init__()の中でインスタンス変数self.aを作成するようにします。あとは必要に応じてセッターなりゲッターなりを作れば良いです(ただしpythonの場合、セッターとゲッターは作らないで済ませるか、プロパティにして済ませることが多い気がしますが)。

python

1class Aclass: 2 def __init__(self): 3 self.a = "a" # インスタンス変数を作る正しい方法 4 def set_a(self, value): 5 self.a = value

ちなみに、クラス変数を変更したい場合、Aclass.aとしてアクセスするか、self.__class__.aとしてアクセスするかのどちらかを使うことになります。ケースバイケースで。


いずれにせよ、tiitoiさんが指摘されているように何らかのオブジェクトをBに渡さないと駄目ですね。

投稿2018/11/09 19:10

hayataka2049

総合スコア30933

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

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

sponge_yukari

2018/11/12 05:04

クラス変数に対してself.aで使えていたので、ずっと間違えていたようですね。 __init__内にselfで書く方法は知っていましたが、やってませんでした。 この機会に改めてみようと思います。 ありがとうございました。
hayataka2049

2018/11/12 05:10

そうですね。self経由でクラス変数にアクセスできてしまう仕様になっています。何もしなければそのままクラス変数が見えますが、self.aに対して代入を書いた瞬間に、インスタンス変数self.aが生成されるという仕組みです(コンストラクタにしろこの仕組みでオブジェクトに動的にattributeを追加しているに過ぎません)。
guest

0

ベストアンサー

このように利用する側のクラスに利用される側のオブジェクトを渡すしかないです。

class A: def __init__(self): self.a = 'hoge' class B: def __init__(self, A): self.A = A def process(self): self.A.a = 'fuga' objA = A() objB = B(objA) print(objA.a) # hoge objB.process() print(objA.a) # fuga

処理をクラスごとに分ける関係で、プログレスバーの画面を表示・実行した場所とは別のクラス(ファイル)でラベルの変更を行うこともあります。
このパターンを行う際に、今回の質問内容がほしくなりました。

Qt でプログレスバーの更新を行うなら、シグナルスロットを使いましょう。
進捗が変化した際に発呼するシグナルを処理用のクラスに作成し、QProgressBar の setValue() 関数に connect します。
connect はメイン関数側で行います。
そうすれば、作業を行うクラスからプログレスバーを直接いじる必要がなくなります。

投稿2018/11/09 07:48

tiitoi

総合スコア21956

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

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

sponge_yukari

2018/11/12 05:08

Bに対して参照渡ししてあげる感じでしょうか。 やはり初歩的なものだったようですね。 Qtの件までありがとうございます。 シグナルスロットはまだあまり理解できていませんが、試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問