質問: 100 classname.func() ``` ### 質問です 1:変数aの値を書き換える方法を教えてください。また、クラスの内容を書き換えることをオーバーライドと呼ぶのでしょうか? 2:変数aを100に書き換えたいというコードですが、4行目のaが定義されていないというエラーが出るようです。selfが関係しているでしょうか? しかし、func関数からしたらグローバル変数なのだから、アクセスできるはずですが、、、 なかなか素人にもわかるような解説サイトがないので、質問させてもらいます。 ### 補足 ごめんなさい治しました( ́・ω・`)
回答: > > 1:変数aの値を書き換える方法を教えてください。また、クラスの内容を書き換えることをオーバーライドと呼ぶのでしょうか? > > > 質問文の例はおそらく意図している動作とは違いますし、オーバーライド「ではない」と言えます。 ###### 理由1 `classname.a = 100`だと親クラスのクラス変数`a`を変更してしまうからです。これでは親クラスに影響が及んでしまいます。 ``` class Hoge: a = 10 ``` というクラスがあったとして、 ``` class Fuga(Hoge): 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`引数がないのも変ですね(前にも書いたので繰り返しません)。