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

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

新規登録して質問してみよう
ただいま回答率
85.35%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

1194閲覧

(python)(クラスの継承)親クラスで変数を変更したときに、同時に子クラスの変数も変更したい

kaneko_

総合スコア10

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/07/30 10:16

前提・実現したいこと

pythonにおいて、親クラスで定義時に代入した変数が、子クラスでは変更されるようにしたいです。
よろしくおねがいします。
以下に例を示します。

該当のソースコード

python

1class parent(): 2 def __init__(self,a=None): 3 self.a=a 4 5class child(parent): 6 def pri(self): 7 print(self.a) 8 9p=parent(1) 10print(p.a) #1 11c=child() 12c.pri() #この値を1にしたい 13print(c.a) #この値を1にしたい

補足情報(FW/ツールのバージョンなど)

google colabにて記述

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

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

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

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

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

guest

回答2

0

ベストアンサー

値が決められませんね。
どうしたいのでしょう。

python

1p1=parent(1) 2print(p1.a) #1 3p2=parent(2) 4print(p2.a) #2 5c=child() 6c.pri() #この値は1にしたいのですか、2にしたいのですか? 7print(c.a) #この値を1にしたいのですか、2にしたいのですか?

2にしたいのですね。

出来るか出来ないかというと出来ますが、クラスの使い方として普通はそういうことをやらないようにするでしょう。

お勧めでない方法

python

1>>> class parent(): 2... def __init__(self,a=None): 3... parent.a=a 4... 5>>> class child(parent): 6... def __init__(self): 7... pass 8... def pri(self): 9... print(self.a) 10... 11>>> p1=parent(1) 12>>> print(p1.a) #1 131 14>>> p2=parent(2) 15>>> print(p2.a) #2 162 17>>> c=child() 18>>> c.pri() #この値は1にしたいのですか、2にしたいのですか? 192 20>>> print(c.a) #この値を1にしたいのですか、2にしたいのですか? 212

普通やる方法

python

1>>> class parent(): 2... @classmethod 3... def set_a(self,a): 4... parent.a=a 5... 6>>> class child(parent): 7... def pri(self): 8... print(self.a) 9... 10>>> parent.set_a(1) 11>>> print(parent.a) #1 121 13>>> parent.set_a(2) 14>>> print(parent.a) #2 152 16>>> c=child() 17>>> c.pri() #この値は1にしたいのですか、2にしたいのですか? 182 19>>> print(c.a) #この値を1にしたいのですか、2にしたいのですか? 202

投稿2021/07/30 10:55

編集2021/07/30 12:22
ppaul

総合スコア24670

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

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

kaneko_

2021/07/30 11:51

2にしたいです。 親ノードを参照した時のみコンストラクタ内の変数をセットし、子ノードを参照してもそのセットされた変数が変わらないようにしたいです。 よろしくお願いします。
guest

0

以下のように、子クラス内で参照したいとき、クラスの外側で参照したいときともに、self.aの代わりにp.aを参照すれば解決しました。

python

1class parent(): 2 def __init__(self,a=None): 3 print("yobidasi") 4 self.a=a 5 6class child(parent): 7 def __init__(self): 8 pass 9 def pri(self): 10 print(p.a) #self.aじゃない 11 12p1=parent(1) 13print(p1.a) #1 14p2=parent(2) 15print(p2.a) #2 16c=child() 17c.pri() 18print(p.a) #c.aじゃない 19

また、子ノード内に

def __init__(self): pass

をつけなければ、子ノードの定義時に親ノードのコンストラクタが参照されてしまい、self.a(もしくはc.a)が生成されてしまうようです。

投稿2021/07/30 12:29

kaneko_

総合スコア10

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

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

quickquip

2021/07/30 12:47 編集

これはエラーになって動かないでしょう そして意図が分からないため具体的な「こうすればいい」という指摘ができません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問