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

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

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

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

Q&A

解決済

1回答

1040閲覧

クラスのメソッド継承し変数のみ変えたいが、サブクラスを実行するとスーパークラスも同時に実行されてしまう

oono

総合スコア38

Python

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

0グッド

0クリップ

投稿2019/07/03 05:01

前提・実現したいこと

クラス継承において、スーパークラス内のメソッドのみを継承し、サブクラスにおいて変数を変えて継承した当該メソッドを実行したい。

発生している問題・エラーメッセージ

サブクラスBを実行すると、スーパークラスA がそのまま実行されて、続いて追加されて変数の変わったサブクラスB が実行される。即ち下記ソースコードにおいて B("鈴木)の実行結果が、私は鈴木です あなたは鈴木です と二つ出てくる。私としては一つ目不要。

該当のソースコード

class A:
def init(self,name):
self.name=name
self.s="私は"
self.v="です"
self.print1()
def print1(self):
return print(self.s+self.name+self.v)
class B(A):
def init(self,name):
super().init(name)
self.s="あなたは"
self.print2()
def print2(self):
return print(self.s+self.name+self.v)
B("鈴木")

試したこと

とりあえず、色々な場で使いたかったので、上記AのスーパークラスのサブクラスCとして以下のように書いたところ問題解決したが。。v="です"は変更しないのにもう一回定義しなければならんないし。結局スーパークラスのメソッドprint1のコマンドをコピーしているだけ。長いコマンドの場合便利ではあるが。。。釈然としない。
class C:
def init(self,name):
self.name=name
self.s="あなたは"
self.v="です"
self.print3()
def print3(self):
A.print1(self)
C("鈴木")

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

hayataka2049

2019/07/03 05:03

表示上インデントが消えたりして読めないので、質問文を編集して<code>ボタンで挿入できるコードブロックの中にコードを入れてください。 https://teratail.com/tour
y_waiwai

2019/07/03 05:04

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

ベストアンサー

クラスを継承すると、基底クラスと派生クラスの両方の
コンストラクタが呼び出されるので、コンストラクタに
print の呼び出しがあると、2つ表示されるのは当然のことです。
コンストラクタに print の呼び出しを書くのは変です。

A を継承した B は self.s だけが異なるので、
B にはそれだけを書くべきです。

次のように書けばよいのではないでしょうか?

Python

1class A: 2 def __init__(self, name): 3 self.name = name 4 self.s = "私は" 5 self.v = "です" 6 7 def print1(self): 8 return print(self.s + self.name + self.v) 9 10class B(A): 11 def __init__(self, name): 12 super().__init__(name) 13 self.s = "あなたは" 14 15A("佐藤").print1() 16B("鈴木").print1() 17b = B("田中") 18b.print1() 19

投稿2019/07/03 13:20

編集2019/07/03 13:48
kazuma-s

総合スコア8224

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

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

oono

2019/07/03 14:42

ありがとうございました。できました。継承とselfの意味をようやくしっかり把握できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問