Pythonではユーザー入力を受け付けることが可能です。

これにより、ユーザーに入力を求めることができます。

Python 3.6ではinput()メソッドが使用されます。

Python 2.7ではraw_input()メソッドが使用されます。

次の例では、ユーザー名を入力して、そのユーザー名を画面に表示します:

Python 3.6

username = input("ユーザー名を入力してください:")
print("ユーザー名は: " + username)

Python 2.7

username = raw_input("ユーザー名を入力してください:")
print("ユーザー名は: " + username)

Pythonはinput()関数に達すると実行を停止し、ユーザーが入力を行うと再開します。

Note: tryブロックは、エラーをテストするためのコードブロックです。

exceptブロックはエラーを処理します。

elseブロックは、エラーが発生しない場合にコードを実行します。

finallyブロックは、tryブロックとexceptブロックの結果に関係なく、常にコードを実行します。

目次

例外処理

エラーが発生すると、通常、Pythonは停止しエラーメッセージを生成します。

これらの例外はtry文を使用して処理できます:

try:
  print(x)
except:
  print("例外が発生しました")

tryブロックがエラーを発生させるため、exceptブロックが実行されます。

tryブロックがない場合、プログラムはクラッシュしエラーを発生させます:

print(x)

多くの例外を定義でき、特定の種類のエラーに対して特別なコードブロックを実行できます:

try:
  print(x)
except NameError:
  print("変数xは定義されていません")
except:
  print("何かが間違っています")

Else

elseキーワードを使用して、エラーが発生しなかった場合に実行するコードブロックを定義できます:

try:
  print("こんにちは")
except:
  print("何かが間違っています")
else:
  print("問題は発生しませんでした")

Finally

finallyブロックは指定された場合、tryブロックがエラーを発生させたかどうかに関係なく、常に実行されます。

try:
  print(x)
except:
  print("何かが間違っています")
finally:
  print("try exceptは終了しました")

これはオブジェクトを閉じ、リソースをクリーンアップするのに便利です:

try:
  f = open("demofile.txt")
  try:
    f.write("Lorem Ipsum")
  except:
    print("ファイルへの書き込み中にエラーが発生しました")
  finally:
    f.close()
except:
  print("ファイルのオープン中にエラーが発生しました")

このプログラムはファイルオブジェクトを開いたままにしません。

例外を発生させる

Python開発者として、条件が発生した場合に例外をスローすることができます。

例外をスローするには、raiseキーワードを使用します。

x = -1

if x < 0:
  raise Exception("マイナスの数は許可されていません")

raiseキーワードは例外をスローするために使用されます。

どのようなエラーをスローするか、およびユーザーに表示するテキストを定義できます。

x = "hello"

if not type(x) is int:
  raise TypeError("整数のみが許可されています")

Note: PIP(パイプ)はPythonのパッケージ、もしくはモジュールのためのパッケージマネージャーです。

Pythonバージョン3.4以降をお使いの場合、PIPはデフォルトで含まれています。

目次

パッケージとは?

パッケージにはモジュールに必要なすべてのファイルが含まれています。

モジュールはPythonコードのライブラリで、プロジェクトに含めることができます。

PIPのインストール確認方法

コマンドラインを使用して、Pythonのスクリプトディレクトリの場所に移動し、次のコマンドを入力します:

PIPのバージョンを確認します:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip --version

PIPのインストール方法

PIPがインストールされていない場合、次のページからダウンロードしてインストールできます:https://pypi.org/project/pip/

パッケージのダウンロード

パッケージのダウンロードは非常に簡単です。

コマンドラインインターフェースを開き、PIPにダウンロードしたいパッケージを指示します。

“camelcase” という名前のパッケージをダウンロードします:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip install camelcase

これで、最初のパッケージをダウンロードしてインストールしました!

パッケージの使用方法

パッケージがインストールされたら、すぐに使用できます。

プロジェクトに “camelcase” パッケージをインポートします。

“camelcase” をインポートして使用します:

import camelcase

c = camelcase.CamelCase()

txt = "hello world"

print(c.hump(txt))

パッケージの検索

さらに多くのパッケージをPyPIで見つけることができます。

パッケージの削除

パッケージを削除するには、以下のアンインストールコマンドを使用します:

“camelcase” という名前のパッケージをアンインストールします:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip uninstall camelcase

PIPパッケージマネージャーは、camelcaseパッケージを削除するかどうか確認します:

Uninstalling camelcase-02.1:
  Would remove:
    c:\users\Your Name\appdata\local\programs\python\python36-32\lib\site-packages\camelcase-0.2-py3.6.egg-info
    c:\users\Your Name\appdata\local\programs\python\python36-32\lib\site-packages\camelcase\*
Proceed (y/n)?

y を押すとパッケージが削除されます。

インストールされたパッケージの一覧表示

システムにインストールされているすべてのパッケージをリストするには、以下のリストコマンドを使用します:

インストールされているパッケージの一覧を表示します:

C:\Users\Your Name\AppData\Local\Programs\Python\Python36-32\Scripts>pip list

結果:

Package         Version
-----------------------
camelcase       0.2
mysql-connector 2.1.6
pip             18.1
pymongo         3.6.1
setuptools      39.0.1

Note: 正規表現は、検索パターンを形成する文字のシーケンスです。

正規表現は指定した検索パターンが文字列に含まれるかどうかをチェックするために使用されます。

目次

RegEx モジュール

Python には正規表現を扱うための組み込みパッケージ re があります。

re モジュールのインポート

import re

Python における正規表現

re モジュールをインポートしたら、正規表現を使用できます:

文字列が “The” で始まり “Spain” で終わるかどうかを調べます:

import re

txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)

RegEx 関数

re モジュールには、文字列を検索して一致するものを見つけるための関数群が用意されています:

関数 説明
findall() 全ての一致を含むリストを返します
search() 文字列全体で一致がある場合は Match オブジェクトを返します
split() 一致した場所で文字列を分割したリストを返します
sub() 一致した文字列を指定した文字列で置換します

メタ文字

メタ文字は特別な意味を持つ文字です:

文字 説明
[] 一連の文字を表します “[a-m]”
\ 特別なシーケンスを示します(特殊文字をエスケープするためにも使用します) “\d”
. 改行文字を除く任意の文字 “he..o”
^ 文字列の先頭 “^hello”
$ 文字列の末尾 “planet$”
* 0回以上の出現 “he.*o”
+ 1回以上の出現 “he.+o”
? 0回または1回の出現 “he.?o”
{} 指定した回数の出現 “he.{2}o”
| どちらか一方 “falls|stays”
() キャプチャおよびグループ化

特殊シーケンス

特殊シーケンスは \ の後に特定の文字が続き、特別な意味を持ちます:

文字 説明
\A 文字列の先頭に指定した文字がある場合に一致します “\AThe”
\b 単語の先頭または末尾に指定した文字がある場合に一致します(行頭に “r” があることで “raw string” として扱われることに注意してください) r”\bain” r”ain\b”
\B 指定した文字が存在する場合に一致しますが、単語の先頭(または末尾)ではありません(行頭に “r” があることで “raw string” として扱われることに注意してください) r”\Bain” r”ain\B”
\d 文字列に数字(0~9)が含まれる場合に一致します “\d”
\D 文字列に数字が含まれない場合に一致します “\D”
\s 文字列に空白文字が含まれる場合に一致します “\s”
\S 文字列に空白文字が含まれない場合に一致します “\S”
\w 文字列に単語文字(a ~ Z、0 ~ 9、およびアンダースコア _)が含まれる場合に一致します “\w”
\W 文字列に単語文字が含まれない場合に一致します “\W”
\Z 文字列の末尾に指定した文字がある場合に一致します “Spain\Z”

セット

セットは、角かっこ [] の中に特別な意味を持つ文字のセットを指定します:

セット 説明
[arn] 指定した文字(a、r、または n)のいずれかが存在する場合に一致します
[a-n] a から n までのアルファベット順の小文字に一致します
[^arn] a、r、n 以外の任意の文字に一致します
[0123] 指定した数字(0、1、2、または 3)のいずれかが存在する場合に一致します
[0-9] 0 から 9 までの任意の数字に一致します
[0-5][0-9] 00 から 59 までの任意の二桁の数字に一致します
[a-zA-Z] 小文字または大文字のアルファベット順の任意の文字に一致します
[+] セット内では特に意味を持ちません。+ 文字自体に一致します

findall() 関数

findall() 関数はすべての一致を含むリストを返します。

すべての一致した文字列をリストで表示します:

import re

txt = "The rain in Spain"
x = re.findall("ai", txt)
print(x)

リストは一致した順に表示されます。

一致するものがない場合、空のリストが返されます:

一致しなかった場合は空のリストが返されます:

import re

txt = "The rain in Spain"
x = re.findall("Portugal", txt)
print(x)

search() 関数

search() 関数は文字列全体を検索し、一致がある場合は Match オブジェクトを返します。

複数の一致がある場合、最初の一致のみが返されます:

文字列内の最初の空白文字を検索します:

import re

txt = "The rain in Spain"
x = re.search("\s", txt)

print("最初の空白文字は位置:", x.start())

一致がない場合、値 None が返されます:

一致しなかった場合の検索:

import re

txt = "The rain in Spain"
x = re.search("Portugal", txt)
print(x)

split() 関数

split() 関数は一致した場所で文字列を分割したリストを返します:

各空白文字で分割します:

import re

txt = "The rain in Spain"
x = re.split("\s", txt)
print(x)

maxsplit パラメータを指定することで、分割数を制御できます:

最初の一致でのみ分割します:

import re

txt = "The rain in Spain"
x = re.split("\s", txt, 1)
print(x)

sub() 関数

sub() 関数は一致した文字列を指定したテキストで置換します:

各空白文字を数字 9 で置換します:

import re

txt = "The rain in Spain"
x = re.sub("\s", "9", txt)
print(x)

count パラメータを指定することで、置換数を制御できます:

最初の 2 つの一致を置換します:

import re

txt = "The rain in Spain"
x = re.sub("\s", "9", txt, 2)
print(x)

Match オブジェクト

Match オブジェクトは検索と結果に関する情報を含むオブジェクトです。

注意:一致がない場合、Match オブジェクトの代わりに値 None が返されます。

Match オブジェクトを返す検索:

import re

txt = "The rain in Spain"
x = re.search("ai", txt)
print(x) # これはオブジェクトを出力します

Match オブジェクトには、検索と結果に関する情報を取得するためのプロパティやメソッドがあります:

最初の一致位置(開始位置と終了位置)を出力します。

正規表現は大文字 “S” で始まる単語を探します:

import re

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.span())

関数に渡された文字列を出力します:

import re

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.string)

一致の部分を出力します。

正規表現は大文字 “S” で始まる単語を探します:

import re

txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.group())

注意:一致がない場合、Match オブジェクトの代わりに値 None が返されます。

Note: JSON はデータを保存して交換するための構文です。

JSON は JavaScript オブジェクト表記で書かれたテキストです。

目次

Python における JSON

Python には JSON データを扱うための組み込みパッケージ json があります。

json モジュールをインポートします:

import json

JSON 文字列がある場合、json.loads() メソッドを使用して解析できます。結果は Python の辞書になります。

import json

# いくつかの JSON:
x =  '{ "name":"John", "age":30, "city":"New York"}'

# 解析する:
y = json.loads(x)

# 結果は Python の辞書です:
print(y["age"])

結果:

30

Python オブジェクトがある場合、json.dumps() メソッドを使用して JSON 文字列に変換できます。

import json

# Python オブジェクト(辞書):
x = {
  "name": "John",
  "age": 30,
  "city": "New York"
}

# JSON に変換:
y = json.dumps(x)

# 結果は JSON 文字列です:
print(y)

結果:

{"name": "John", "age": 30, "city": "New York"}

以下の Python オブジェクトを JSON 文字列に変換できます:

import json

print(json.dumps({"name": "John", "age": 30}))
print(json.dumps(["apple", "bananas"]))
print(json.dumps(("apple", "bananas")))
print(json.dumps("hello"))
print(json.dumps(42))
print(json.dumps(31.76))
print(json.dumps(True))
print(json.dumps(False))
print(json.dumps(None))

Python から JSON に変換する際、Python オブジェクトは JSON(JavaScript)の対応するデータ型に変換されます:

Python JSON
辞書 Object
リスト Array
タプル Array
文字列 String
整数 Number
浮動小数点数 Number
True true
False false
None null

すべての法的なデータ型を含む Python オブジェクトを JSON 文字列に変換します:

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

print(json.dumps(x))

結果のフォーマットを整える

上記の例は JSON 文字列を出力しますが、インデントや改行がなく、読みやすくありません。

json.dumps() メソッドには、結果をより読みやすくするためのパラメータがあります:

インデントパラメータを使用してインデント数を定義します:

json.dumps(x, indent=4)

セパレータを定義することもできます。デフォルト値は (“, “, “: “) で、それぞれのオブジェクトを区切るためにコンマとスペースを、キーと値を区切るためにコロンとスペースを使用します:

json.dumps(x, indent=4, separators=(". ", " = "))

結果のキーの順序を整理するための sort_keys パラメータもあります:

json.dumps(x, indent=4, sort_keys=True)

Note: Python には、数値に対する数学的なタスクを実行するための組み込み数学関数があり、また豊富な数学モジュールも提供されています。

目次

組み込み数学関数

min() 関数と max() 関数は、イテラブルな要素の中から最小値または最大値を見つけるために使用されます:

x = min(5, 10, 25)
y = max(5, 10, 25)

print(x)
print(y)

結果:

5
25

abs() 関数は指定された数値の絶対値(正の値)を返します:

x = abs(-7.25)

print(x)

結果:

7.25

pow(x, y) 関数は x の y 乗の値を返します(xy):

x = pow(4, 3)

print(x)

結果:

64

数学モジュール

Python には math という組み込みモジュールもあり、さまざまな数学関数を提供しています。

math モジュールを使用するには、まずモジュールをインポートする必要があります:

import math

math モジュールをインポートしたら、そのモジュールのメソッドや定数を使用することができます。

例えば、math.sqrt() メソッドは指定した数値の平方根を返します:

import math

x = math.sqrt(64)

print(x)

結果:

8.0

math.ceil() メソッドは数値をその最も近い整数に向かって切り上げ、math.floor() メソッドは数値をその最も近い整数に向かって切り下げ、結果を返します:

import math

x = math.ceil(1.4)
y = math.floor(1.4)

print(x) # returns 2
print(y) # returns 1

結果:

2
1

math.pi 定数は PI の値(3.14…)を返します:

import math

x = math.pi

print(x)

結果:

3.141592653589793

Note: Python における日付は、独自のデータ型ではなく、日付オブジェクトとして扱うために datetime モジュールをインポートします。

目次

Python Dates

Pythonにおける日付は独自のデータ型ではなく、日付オブジェクトとして扱うために datetime モジュールをインポートします。

datetime モジュールをインポートし、現在の日付を表示します:

import datetime

x = datetime.datetime.now()
print(x)

日付の出力

上記の例のコードを実行すると、次の結果が得られます:

2024-07-09 11:25:56.518891

日付には年、月、日、時、分、秒、マイクロ秒が含まれます。

datetime モジュールには、日付オブジェクトに関する情報を返す多くのメソッドがあります。

以下にいくつかの例を示しますが、この章の後半で詳しく学びます:

年と曜日名を返します:

import datetime

x = datetime.datetime.now()

print(x.year)
print(x.strftime("%A"))

日付オブジェクトの作成

日付を作成するには、datetime モジュールの datetime() クラス(コンストラクタ)を使用します。

datetime() クラスには、年、月、日の3つのパラメータが必要です:

日付オブジェクトを作成します:

import datetime

x = datetime.datetime(2020, 5, 17)

print(x)

datetime() クラスは、時間とタイムゾーン(時、分、秒、マイクロ秒、タイムゾーンの tzone)のパラメータも受け取りますが、これらはオプションで、デフォルト値は 0 です(タイムゾーンには None)。

strftime() メソッド

datetime オブジェクトには、日付オブジェクトを読みやすい文字列にフォーマットするためのメソッドがあります。

このメソッドは strftime() と呼ばれ、戻り値の文字列のフォーマットを指定するために format パラメータを取ります:

月の名前を表示します:

import datetime

x = datetime.datetime(2018, 6, 1)

print(x.strftime("%B"))

すべての有効なフォーマットコードの参照:

ディレクティブ 説明
%a 曜日の短いバージョン Wed
%A 曜日の完全なバージョン Wednesday
%w 曜日を 0-6 の数字で表現(0 は日曜日) 3
%d 月の日付 01-31 31
%b 月の名前の短いバージョン Dec
%B 月の名前の完全なバージョン December
%m 月を 01-12 の数字で表現 12
%y 世紀を含まない年の短いバージョン 18
%Y 年の完全なバージョン 2018
%H 時間を 00-23 で表現 17
%I 時間を 00-12 で表現 05
%p AM/PM PM
%M 分を 00-59 で表現 41
%S 秒を 00-59 で表現 08
%f マイクロ秒を 000000-999999 で表現 548513
%z UTC オフセット +0100
%Z タイムゾーン CST
%j 年の日数 001-366 365
%U 年の週番号(週の最初が日曜日) 00-53 52
%W 年の週番号(週の最初が月曜日) 00-53 52
%c 日付と時刻のローカルバージョン Mon Dec 31 17:41:00 2018
%C 世紀 20
%x 日付のローカルバージョン 12/31/18
%X 時間のローカルバージョン 17:41:00
%% パーセント記号 %
%G ISO 8601 年 2018
%u ISO 8601 曜日(1-7) 1
%V ISO 8601 週番号(01-53) 01

Note: モジュールとは、コードライブラリと同じものと考えてください。

アプリケーションに含めたい関数のセットを含むファイルです。

目次

モジュールの作成

モジュールを作成するには、拡張子 .py を持つファイルに必要なコードを保存します:

以下のコードを mymodule.py という名前のファイルに保存します:

def greeting(name):
  print("Hello, " + name)

モジュールの使用

作成したモジュールを使うには、import ステートメントを使用します:

mymodule という名前のモジュールをインポートし、greeting 関数を呼び出します:

import mymodule

mymodule.greeting("Jonathan")

Note: モジュールから関数を使用する場合は、module_name.function_name の構文を使用します。

モジュール内の変数

モジュールには関数だけでなく、あらゆるタイプの変数(配列、辞書、オブジェクトなど)を含めることができます:

以下のコードを mymodule.py ファイルに保存します:

person1 = {
  "name": "John",
  "age": 36,
  "country": "Norway"
}

mymodule という名前のモジュールをインポートし、person1 辞書にアクセスします:

import mymodule

a = mymodule.person1["age"]
print(a)

モジュールの名前付け

モジュールファイルの名前は何でもかまいませんが、拡張子 .py を持つ必要があります。

モジュールのエイリアス付け

モジュールをインポートする際に、as キーワードを使用してエイリアスを作成することができます:

mymodule に対するエイリアスとして mx を作成します:

import mymodule as mx

a = mx.person1["age"]
print(a)

組み込みモジュール

Pythonにはいくつかの組み込みモジュールがあり、必要に応じていつでもインポートできます。

platform モジュールをインポートして使用します:

import platform

x = platform.system()
print(x)

dir() 関数の使用

モジュール内のすべての関数名(または変数名)をリストする組み込み関数があります。それが dir() 関数です:

platform モジュールに属するすべての定義済み名をリストします:

import platform

x = dir(platform)
print(x)

Note: dir() 関数はすべてのモジュールで使用でき、あなた自身で作成したモジュールも含まれます。

モジュールからのインポート

from キーワードを使用してモジュールの一部だけをインポートすることができます。

mymodule という名前のモジュールには1つの関数と1つの辞書があります:

def greeting(name):
  print("Hello, " + name)

person1 = {
  "name": "John",
  "age": 36,
  "country": "Norway"
}

モジュールから person1 辞書のみをインポートします:

from mymodule import person1

print(person1["age"])

Note: from キーワードを使用してインポートする場合、モジュール名は使用せず、モジュール内の要素を参照します。例:person1["age"]mymodule.person1["age"] ではありません。

Note: 変数は作成された領域内でのみ利用可能です。これをスコープと呼びます。

目次

ローカルスコープ

関数内で作成された変数はその関数のローカルスコープに属し、その関数内でのみ使用できます。

関数内で作成された変数はその関数内で利用できます:

def myfunc():
  x = 300
  print(x)

myfunc()

関数内の関数

上記の例で説明したように、変数 x は関数の外では利用できませんが、関数内の任意の関数からは利用できます:

ローカル変数は関数内の関数からアクセスできます:

def myfunc():
  x = 300
  def myinnerfunc():
    print(x)
  myinnerfunc()

myfunc()

グローバルスコープ

Pythonコードのメイン部分で作成された変数はグローバル変数であり、グローバルスコープに属します。

グローバル変数はどのスコープからでも利用可能です。

関数の外で作成された変数はグローバルであり、誰でも利用できます:

x = 300

def myfunc():
  print(x)

myfunc()

print(x)

変数の命名

関数の内外で同じ変数名を使用する場合、Pythonはそれらを別々の変数として扱います。一つはグローバルスコープ(関数の外)、もう一つはローカルスコープ(関数の内)です。

この関数はローカルの x を表示し、その後コードはグローバルの x を表示します:

x = 300

def myfunc():
  x = 200
  print(x)

myfunc()

print(x)

グローバルキーワード

ローカルスコープに固執したままグローバル変数を作成する必要がある場合、global キーワードを使用できます。

global キーワードにより変数はグローバルスコープになります。

global キーワードを使用すると、変数はグローバルスコープに属します:

def myfunc():
  global x
  x = 300

myfunc()

print(x)

また、関数内でグローバル変数の値を変更する場合も、global キーワードを使用します。

関数内でグローバル変数の値を変更する場合は、global キーワードを使用して変数にアクセスします:

x = 300

def myfunc():
  global x
  x = 200

myfunc()

print(x)

nonlocalキーワード

nonlocal キーワードはネストした関数内で変数を扱う場合に使用されます。

nonlocal キーワードにより変数は外側の関数に属します。

nonlocal キーワードを使用すると、変数は外側の関数に属します:

def myfunc1():
  x = "Jane"
  def myfunc2():
    nonlocal x
    x = "hello"
  myfunc2()
  return x

print(myfunc1())

Note: 「ポリモーフィズム」という言葉は「多様な形」という意味であり、プログラミングにおいては同じ名前のメソッド/関数/演算子が多くのオブジェクトやクラスで実行可能であることを指します。

目次

関数のポリモーフィズム

異なるオブジェクトで使用できるPython関数の例としては、len() 関数があります。

文字列

len() は文字列の文字数を返します:

x = "Hello World!"

print(len(x))

タプル

len() はタプル内のアイテム数を返します:

mytuple = ("apple", "banana", "cherry")

print(len(mytuple))

辞書

len() は辞書内のキー/値ペア数を返します:

thisdict = {
  "brand": "Ford",
  "model": "Mustang",
  "year": 1964
}

print(len(thisdict))

クラスのポリモーフィズム

ポリモーフィズムはクラスのメソッドでよく使用され、複数のクラスで同じメソッド名を持つことができます。

異なるクラスで同じメソッドを持つ場合:

class Car:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Drive!")

class Boat:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Sail!")

class Plane:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Fly!")

car1 = Car("Ford", "Mustang")       # Car クラスのインスタンスを作成
boat1 = Boat("Ibiza", "Touring 20") # Boat クラスのインスタンスを作成
plane1 = Plane("Boeing", "747")     # Plane クラスのインスタンスを作成

for x in (car1, boat1, plane1):
  x.move()

上記の最後のforループを見てください。ポリモーフィズムのおかげで、すべてのクラスで同じメソッドを実行することができます。

継承クラスのポリモーフィズム

親クラス名が同じ子クラスを持つクラスでポリモーフィズムを使用できるでしょうか?

答えは「YES」です。上記の例を使用して、親クラスとしてVehicleというクラスを作成し、Car、Boat、PlaneをVehicleクラスの子クラスにすれば、子クラスはVehicleのメソッドを継承しますが、オーバーライドすることもできます:

Vehicleというクラスを作成し、Car、Boat、PlaneをVehicleクラスの子クラスにします:

class Vehicle:
  def __init__(self, brand, model):
    self.brand = brand
    self.model = model

  def move(self):
    print("Move!")

class Car(Vehicle):
  pass

class Boat(Vehicle):
  def move(self):
    print("Sail!")

class Plane(Vehicle):
  def move(self):
    print("Fly!")

car1 = Car("Ford", "Mustang")       # Car オブジェクトを作成
boat1 = Boat("Ibiza", "Touring 20") # Boat オブジェクトを作成
plane1 = Plane("Boeing", "747")     # Plane オブジェクトを作成

for x in (car1, boat1, plane1):
  print(x.brand)
  print(x.model)
  x.move()

上記の例では、Carクラスは空ですが、Vehicleからbrand、model、move()を継承しています。

BoatとPlaneクラスもVehicleからbrand、model、move()を継承していますが、move()メソッドをオーバーライドしています。

ポリモーフィズムのおかげで、すべてのクラスで同じメソッドを実行することができます。