JJ プログラム仙人修行日誌

2024/04/20 からは、プログラム仙人修行の日誌を書いてます。

多態性の説明の間違い(オブジェクト指向)

多態性の説明の間違い

 間違った説明が多く散在しているので,こちらでアップしておきます。 そのうち,直っていくでしょう。

 多態性(polymorphism)は,ポリモルフィズム,ポリモフィーズム,多相性,多様性など呼び名がいろいろあります。poly(多) morph(形,態) という意味です。

 生物学の世界では,同じ遺伝子を持つミツバチだが,働き蜂になったり,女王蜂になる性質を指します。

 オブジェクト指向の世界では,ひとつのインスタンスが複数のクラスのインスタンスとして振る舞うことを指します。 これを,複数の実装があると説明しているものは,間違いです。   (数年前に話題にした記事 https://suehiro3721p.hateblo.jp/entries/2006/03/17#pro )

上の例で,A[1]のインスタンスは,Animal のインスタスでもあり,Dog のインスタンスでもあります。この性質が,多態性です。実行するときの実装が違いますが,これは,オーバーライドされているからです。インスタンスごと実行される実装が違うのは,多態性ではなく,オーバーライドの機能です。

weblio では,ちょうど,カタカナの「ポリモーフィズム」で正しく説明し,英語の「Polymorphism」では間違って説明しているので,対比のため,最初の例にあげておきます。 正しい例は,一つだけで,あとは,訂正されることを願って,間違った例をリストアップしておきます。

正しい例

weblio ポリモーフィズム から

https://ejje.weblio.jp/content/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0 ポリモーフィズム Polymorphism (computer science) ポリモーフィズム(英: Polymorphism)とは、プログラミング言語の型システムの性質を表すもので、プログラミング言語の各要素(定数、変数、式、オブジェクト、関数、メソッドなど)についてそれらが複数の型に属することを許すという性質を指す。  

間違った例(訂正されることを願って,こちらにアップしていきます)

weblio Polymorphism から

https://ejje.weblio.jp/content/Polymorphism コンピューター用語辞典での「Polymorphism」の意味  同一のメッセージに対して個々のオブジェクトが異なった応答を行う能力

以下,見つけ次第追加

用語として説明しているところを中心

ポリモーフィズム@ IT用語辞典バイナリ

https://www.sophia-it.com/content/%E5%A4%9A%E6%85%8B%E6%80%A7 ポリモーフィズムの場合は機能が置き換わるのではなく、同一名称メソッドであるが振る舞いは異なるメソッドとして働く。(これはオーバーライドの説明)

Polymorphism (多態性)@MDN Web Docs 用語集

https://developer.mozilla.org/ja/docs/Glossary/Polymorphism 各クラスがいかなるオブジェクトでも(いったん呼び出されると)適切に動作するそれぞれの関数

基本情報処理技術者試験 平成26年秋季午前問47

多態性とメソッドの実装をサブクラスごとで変更するオーバーライドとは無関係。 リンク先は,問題の引用先 https://www.fe-siken.com/kakomon/26_aki/q47.html ポリモーフィズムは、継承を利用しているため、オーバーライドと同様な機能に見えるが、ポリモーフィズムの場合は機能が置き換わるのではなく、同一名称メソッドであるが振る舞いは異なるメソッドとして働く

ポリモーフィズム 【 polymorphism 】 多相性 / 多態性 / ポリモルフィズム

http://e-words.jp/w/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0.html  ポリモーフィズムとは、プログラミング言語の持つ性質の一つで、ある関数やメソッドなどが、引数や返り値の数やデータ型などの異なる複数の実装を持ち、呼び出し時に使い分けるようにできること。

はてなグループ,継続してほしい。

かなりディープに使ってます。

J塾,TOEIC☆塾グループ関連で,キーワード登録で,1万

語彙を超えているかと思います。

自力で,これだけの機能を作るのは,たいへん。
はてなもメリットある方法で,ぜひ,継続希望。

TOEICに出題されそうな単語の語源解説では,日本一の量です。

http://jjuku.g.hatena.ne.jp/

http://jjuku.g.hatena.ne.jp/

自然派ママ友「レンジは電磁波で変質させるから悪影響がある」→ガチ理系の夫が丁寧に反論「これは惚れ直す案件」「聞いてて気持ちいい!」

https://togetter.com/li/1343279

で,自然ママ叩きが酷い。

電子レンジの害については,こちらが,ただしそう。
https://kosodate-bu.com/health/hukushima-radiater/microwave/

オーバーライドの間違い

本日のメルマガ「宿題メール」から

オーバーライドの間違い

 オブジェクト指向プログラミングにおける,多相性を実現するためのオーバーライド の説明はどれか。

   ア オブジェクト内の詳細な仕様や構造を外部から隠蔽すること

 イ スーパークラスで定義されたメソッドをサブクラスで再定義すること

 ウ 同一クラス内に,メソッド名が同一で,引数の型,個数,並び順が異なる複数のメソッドを定義すること

 エ 複数のクラスの共通する性質をまとめて,抽象化したクラスを作ること

■キーワード■  

■解答■

  基本情報技術者午前平成29年秋問07

   イ スーパークラスで定義されたメソッドをサブクラスで再定義すること

 

 > オーバーライド
> 【英】override
> オーバーライドとは、スーパクラスから継承されたサブクラスにおいて、メンバ関数を独自の機能で上書きすることである。オーバーライドは、オブジェクト指向における多態性(多様性、ポリモーフィズム)の例 である。なお、オーバーライドを可能にするには、引数の型、および、引数の数が同じでなければならない。ちなみに、類似の用語にオーバーロードがあるが、これは同一クラス内で引数の内容が違うものであり、オーバーライドとは異なるものである。
>https://www.weblio.jp/content/%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%89

   どうもありがとうございます。

 > オーバーライドを可能にするには、引数の型、および、引数の数が同じでなければならない。

  は,間違いです。これは,Java の例です。他の言語では違う場合があります。Python では,名前がいっしょなら,オーバーライドします。   なお,解答の

> イ スーパークラスで定義されたメソッドをサブクラスで再定義すること

も,正確にいうと間違いです。再定義ではなく,再実装です。定義は,親クラスのものをそのまま使います。そうしないと,オーバーライドとはいいいません。

2019-02-創刊号 変数の型

www.mag2.com

訂正

サンプルソース

a = (1, 2, 3, 2, 1) #リスト,変更不可配列

a = (1, 2, 3, 2, 1) #タプル,変更不可配列

 

以下は,訂正済み

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Python で合格,基本情報技術者試験        .&&&& **** %%%%. ┃
┃                         &&&&&&******%%%%%% ┃
┃ 発行 斎藤末広 suehiro3721p@gmail.com @は半角 '&┃&''*┃*''%┃%' ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━┻━━┻━━┛

========================================================================

 2019年2月2日 創刊号

 変数の型

========================================================================
Python を動かす 無料の JupyterLab を使う

 Python を学習用にさっと使うなら,今は,JupyterLab(ジュピターラボ)を使う
のが簡単です。インストールして使うこともできますが,学習用のためであれば,
Web で無料に公開してあるところを使えば十分です。

 Google をはじめいろいろなところが,お試しを公開しています

 現在は,Jupyter を公開しているサイトから無料で試せるところと紹介されて
いる,mybinder.org を利用するのがいいでしょう。

 以下の短縮 URL https://goo.gl/AFCsU7
 https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/master?urlpath=lab%2Ftree%2Fdemo

 もし,上記アクセス先が移動していたら,Jupyter.org から,「Try it」,を
選ぶとその時点の公式サイトのオススメの無料サイトに飛べます。

========================================================================
セルにコード入れて,Shift+Enter

 JupyterLab は,Python の対話型実行環境です。Python を対話型で実行する
IPython を利用し,Jupyter Notebook というウェブ実行環境を改良されてできた
ものです。今後は,JupyterLab,Jupyter Notebook を Jupyter と省略します。

 JupyterLab から,Notebook に分類してある,Python 3 を選んで起動します。

 画面の右肩で,Python 3 ○ と表示されておれば,Python が動作します。
mybinder.org で動作させる場合,数分,操作がないと,処理系が止まり
ます。さらに,時間が立つと,作業フォルダが削除されます。
 
 画面の右肩が,「Python 3 ○」が「No Kernel!」とあれば,処理系が
止まっています。作業フォルダが残っている段階であれば,この「No Kernel!」
の表示をクリックして,Python 3 を再起動します。

 作業フォルダが削除された場合は,URL へ再接続して,作業フォルダを
再作成してください。

 なお,プログラムは,保管されません。自分でどこかにコピー&貼り付けして
おきます。

 では,さっそく,動かしてみましょう。

以下の初期化&動作テスト確認プログラムを実行します。

#Sympy 初期化プログラム Ver 1.10 2019/01/16
import numpy as np
import matplotlib.pyplot as plt
from sympy import *
from sympy.plotting import *
from sympy.stats import *
from sympy.ntheory import *
%matplotlib inline
var("a:z") # a から z までの一文字変数は,記号変数とする
rt = sqrt
init_printing()
Integral(x**2+x, x), rt(2)

 長細い四角の枠を,セルといいます。このコードをセルに貼り付けして,Shift+Enter
で,実行してみてください。

 積分記号が表示されたら,成功です。

========================================================================
Python 入門 その1 変数の型

 Python では,変数とその型は,インスタンスとクラスの形となります。

 Python の変数(インスタンス)の基本な型(クラス)は,次の5つです。

-真偽型,例:True, False
-整数型,有効桁数は自動可変
-浮動小数点型,倍精度のみ
-複素数型,例: 3 + 2j (i は,j と書く)
-文字列型

です。これらを要素して

コレクション系
-配列(変更可能かいなかで次の2種類)
--リスト型(他言語の配列に相当,変更可能)
--タプル型(変更不可能な配列)
-集合型
-辞書型(他言語では,キャシュ,連想配列,マップとも呼ばれているも)

があります。

 以上が,インポートの指定なしに使える型です。

 さらに,外部モジュールからインポートすれば,多様な型があります。

以下のソースを,動作させて確かめてください。

長方形のセルに貼り付け,Shift+Enter で実行できます。

#基本の型
a = (1==1) #真偽型
print(type(a), a)

a = 1000000000000000000000000000 + 2 # 整数型
print(type(a), a)

a = 0.1234567890123456789e100 # 浮動小数点型
print(type(a), a)

a = 3 + 4j # 虚数
print(type(a), a)

a = "ABC" # 文字列型
print(type(a), a)

#配列,コレクション系
a = [1, 2, 3, 2, 1] #リスト,変更可能配列
print(type(a), a)

a = (1, 2, 3, 2, 1) #タプル,変更不可配列
print(type(a), a)

a = {1, 2, 3, 2, 1} #集合
print(type(a), a)

a = {"apple":"りんご", "peach":"桃", "banana":"バナナ"} #辞書
print(type(a), a)

#import で好きなように拡張

import decimal # 10進数演算
a = decimal.Decimal(1) / decimal.Decimal(3)
b = 1/3 #通常の浮動小数点型
print(type(a), a)
print(type(b), b)

import fractions # 分数表記用
a = fractions.Fraction(2, 5)
b = 2/5 #通常の浮動小数点型
print(type(a), a)
print(type(b), b)

import numpy # 高速演算用整数配列
a = numpy.asarray([1, 2, 3], dtype=numpy.int32)
print(type(a), a)

import sympy # 数式表記用
x = sympy.Symbol('x')
a = 2*x + 3*x
print(type(a), a)

========================================================================
ぜひ,以下をご返信して,ご意見をおきかせください。
返信すると,suehiro3721p@gmail.com @は半角 に送られます。

感想


質問


扱ってほしいテーマ