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

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

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

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

Q&A

解決済

2回答

1733閲覧

クラスの書き換えとオーバーライドは同じか?

blendegg

総合スコア81

Python

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

0グッド

0クリップ

投稿2019/05/08 01:16

編集2019/05/08 01:54

###疑問
クラスを継承したあとで、書き換える方法がわからないので教えてください。
さがしてみたんですが、初心者に理解できるものが見つからなかったです。

###コード

python

1class classname(): 2 a = 10 3 def func(): 4 print(a) 5 6class myclass(classname): 7 classname.a = 100 8 classname.func()

###質問です
1:変数aの値を書き換える方法を教えてください。また、クラスの内容を書き換えることをオーバーライドと呼ぶのでしょうか?

2:変数aを100に書き換えたいというコードですが、4行目のaが定義されていないというエラーが出るようです。selfが関係しているでしょうか?
しかし、func関数からしたらグローバル変数なのだから、アクセスできるはずですが、、、
なかなか素人にもわかるような解説サイトがないので、質問させてもらいます。

###補足
ごめんなさい治しました(´・ω・`)

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

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

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

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

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

y_waiwai

2019/05/08 01:18

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

2019/05/08 01:40 編集

コードは質問や修正時の"<コード>" だった気がしますが、それを使って書いてください。 Pythonはインデントが物を言いますよね? 意味が相当変わってくるので、ちゃんと修正してください。 ※ "<code>" になっているようです。
hayataka2049

2019/05/08 04:04

前にも書きましたが、サイトを見てわからなかったのであれば「このサイトの記述のこの部分がわからない」という質問を立てて頂いたほうが良いと思います。このサイトの性質上、初心者向けの解説サイトに詳しい回答者は少ないですし、何回「わからない」と言われても「どうすればわかってもらえるのかわからない」という感想を抱かれてしまいがちです。現時点でわかっている点、わからない点を自分でまとめて、何がわかれば理解できると思うのかを示した方が的確なアドバイスが得られます。
guest

回答2

0

ベストアンサー

1:変数aの値を書き換える方法を教えてください。また、クラスの内容を書き換えることをオーバーライドと呼ぶのでしょうか?

質問文の例はおそらく意図している動作とは違いますし、オーバーライド「ではない」と言えます。

理由1

classname.a = 100だと親クラスのクラス変数aを変更してしまうからです。これでは親クラスに影響が及んでしまいます。

python

1class Hoge: 2 a = 10

というクラスがあったとして、

python

1class Fuga(Hoge): 2 a = 20

とすれば、親クラスHogeには影響を及ぼさずにFuga.aだけ20にすることができます。こういうことを意図しているのだと思います。

理由2

そもそもオーバーライドという言葉は、メソッドに対して使われるのが一般的です。クラス変数で同等のことをするのはオーバーライドとはあまり言わないと思います。

オブジェクト指向プログラミングにおいてオーバーライド (override) とは、スーパークラスで定義されたメソッドをサブクラスで定義し直し、動作を上書き(変更)することである。

オーバーライド - Wikipedia

2:変数aを100に書き換えたいというコードですが、4行目のaが定義されていないというエラーが出るようです。selfが関係しているでしょうか?

あまり知られていないのですが、クラスのスコープは特殊な仕様になっており、クラス定義内に作られた変数は下位スコープから参照できません。

クラス定義ブロックと exec() や eval() に対する引数は、名前解決の文脈で特別です。クラス定義は、名前を使うことと定義することができる実行可能な文です。これらの参照は、名前解決のための通常のルールに従いますが、束縛されていないローカル変数がグローバルな名前空間から検索されるという例外があります。クラス定義の名前空間はクラスの属性辞書になります。クラス内で定義された名前のスコープは、クラスのブロックに限定されます; メソッドのコードブロックには拡張されません。

https://docs.python.org/ja/3/reference/executionmodel.html#resolution-of-names

クラス変数にアクセスする場合は、クラス名.クラス変数名を使ってください。


また、定義されているメソッドにself引数がないのも変ですね(前にも書いたので繰り返しません)。

投稿2019/05/08 04:26

hayataka2049

総合スコア30933

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

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

blendegg

2019/05/08 09:06

回答ありがとうございました クラス変数にアクセスするにはselfが必要ということですね 書き換え方法についても理解できました
hayataka2049

2019/05/08 14:31

>クラス変数にアクセスするにはselfが必要ということですね 違います。selfが「絶対に」必要になるのはインスタンス変数の場合です。クラス変数にはselfに関係なくClassName.VariableNameでアクセス可能です。が、そもそも普通のメソッドの書式としてselfを引数に取るということが決まっているので、おかしいというだけです。
guest

0

さがしてみたんですが、初心者に理解できるものが見つからなかったです。

本当に探しましたか?

そもそも、名称も変ですし、入門書に乗っているレベルです。
( 現に、悪名高いC言語やC++ですら、載っています。 )

~~変数 a はグローバル変数なのでしょうか?
それともフィールド?
そもそもクラスの書き方自体がおかしいです。
言語によって書き方が変わりますが、
~~

(URL先には関係がないため削除)

を見ると、クラス内に直接書いているものがありません

変数aの値を書き換える方法を教えてください。また、クラスの内容を書き換えることをオーバーライドと呼ぶのでしょうか?

本当に探しましたか?

「オーバーライド とは」で検索するとわかりそうでわからないがヒット。

クラスの内容っていうより、メソッドの動きを変えること。

例えばClass1 があり、これは runメソッドを持っているとします。

で、Class1のrunメソッドは "ファイル名を変更する"処理だとします。

これを継承して Class2 を定義。

このClass2のrunを書き換えて、"フォルダ名を変更する" のと、"ファイルを生成する" という処理にする。

すると、Class1で生成されたなら、"ファイル名の変更",
Class2で生成されたなら、"フォルダ名変更"および"ファイル生成"
となる。( runメソッドの動きね。)

この動きの変更のこと。

これはOOPがわからなくても入門書読めばわかると思うんだけど...

2は前述したとおりです。
そもそも書く場所が違う。

~~
メソッドを用意して、それで書き換えるか、
コンストラクタに相当する__init__ ? で書き換える。~~


[追記1]

hayataka2049さんからご指摘を受けました。

上の一部を削除しました。

(恥ずかしい...orz...)

投稿2019/05/08 01:59

編集2019/05/08 04:25
BeatStar

総合スコア4958

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

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

BeatStar

2019/05/08 04:18

hayataka2049さん。 そうなんですか!? 失礼いたしました... 修正します...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問