<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「デストラクタ」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/destructor-jpn/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Tue, 11 Nov 2025 21:14:31 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「デストラクタ」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】クラスの定義と使い方</title>
		<link>https://tech.nkhn37.net/python-class-definition/</link>
					<comments>https://tech.nkhn37.net/python-class-definition/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Fri, 05 Feb 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[クラス]]></category>
		<category><![CDATA[インスタンス]]></category>
		<category><![CDATA[クラスメソッド]]></category>
		<category><![CDATA[コンストラクタ]]></category>
		<category><![CDATA[スタティックメソッド]]></category>
		<category><![CDATA[デストラクタ]]></category>
		<category><![CDATA[特殊メソッド]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=795</guid>

					<description><![CDATA[Python で クラスの定義方法と使い方を解説します。 Python によるオブジェクト指向プログラミング Python は、オブジェクト指向、関数型、手続き型など複数のプログラミングパラダイムをサポートするマルチパラ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python で <span class="jinr-d--text-color d--marker1 d--bold">クラス</span>の定義方法と使い方を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="pythonでのクラス定義">Python によるオブジェクト指向プログラミング</h2>



<p class="wp-block-paragraph">Python は、オブジェクト指向、関数型、手続き型など複数のプログラミングパラダイムをサポートするマルチパラダイム言語です。その中でも<span class="jinr-d--text-color d--marker1 d--bold">オブジェクト指向プログラミング</span>では、データと処理を 1 つにまとめてオブジェクトとして扱います。</p>



<p class="wp-block-paragraph">この記事では、Python でオブジェクト指向プログラミングを行うための基礎知識と、クラス定義やその利用方法について説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="クラスとインスタンス">クラスとインスタンス</h3>



<p class="wp-block-paragraph">オブジェクト指向プログラミングの基本概念として「<span class="jinr-d--text-color d--marker1 d--bold">クラス</span>」と「<span class="jinr-d--text-color d--marker1 d--bold">インスタンス</span>」があります。</p>



<figure class="wp-block-table is-style-regular"><table class="has-fixed-layout"><thead><tr><th>名称</th><th>概要</th></tr></thead><tbody><tr><td>クラス</td><td>データ（変数）と処理（メソッド）を一つにまとめた設計書のようなもの</td></tr><tr><td>インスタンス</td><td>クラスをもとに生成された具体的なオブジェクトのこと</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">例えば、以下のような「<code>Person</code>（人間）」というクラスを考えてみましょう。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="1151" height="660" src="https://tech.nkhn37.net/wp-content/uploads/2021/01/image-55.png" alt="Python クラスとインスタンス" class="wp-image-835" srcset="https://tech.nkhn37.net/wp-content/uploads/2021/01/image-55.png 1151w, https://tech.nkhn37.net/wp-content/uploads/2021/01/image-55-300x172.png 300w, https://tech.nkhn37.net/wp-content/uploads/2021/01/image-55-1024x587.png 1024w, https://tech.nkhn37.net/wp-content/uploads/2021/01/image-55-768x440.png 768w" sizes="(max-width: 1151px) 100vw, 1151px" /></figure>
</div>


<p class="wp-block-paragraph"><code>Person</code> クラスでは、人間の属性（変数）や処理（メソッド）を定義した設計書です。そして、「田中さん」や「佐藤さん」といった具体的な人物がインスタンスになります。クラスが「種類・分類」、インスタンスが「具体的な実例」です。</p>



<p class="wp-block-paragraph">他の例として、「犬」「猫」「国」などがクラスに相当し、「ポチ」「タマ」「アメリカ」などが具体的なインスタンスということになります。</p>



<p class="wp-block-paragraph">クラスのメソッドには、インスタンスに対して行える操作を定義します。例えば、挨拶 (<code>say_hello</code>) や自己紹介 (<code>say_myname</code>) といったものです。メソッドの呼び出しには、インスタンスにメッセージを送って行動を依頼するイメージであり、これをメッセージパッシングと呼びます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">注意点：実世界との違い</h3>



<p class="wp-block-paragraph">オブジェクト指向は、現実世界の比喩で説明されることが多いですが、これは混乱を招くこともあります。</p>



<p class="wp-block-paragraph">現実では、設計図から人を作ることはありませんし、メッセージを送ったら必ず意図通りに反応するとは限りません。また、インスタンスは通常 1 つのクラスに属しますが、現実では 1 人が複数の役割を持つこともあり得ます（例：医者であり、父親である）。</p>



<p class="wp-block-paragraph">オブジェクト指向はあくまでプログラミング技術の 1 つであり、現実世界を必ずしもそのまま再現するものではありません。重要なことは、<span class="jinr-d--text-color d--marker1 d--bold">オブジェクト指向がソフトウェアの再利用性や保守性を高めるための手法である</span>という点になります。クラスやインスタンス、継承、ポリモーフィズム（多態性）といった概念をプログラム設計の視点で学ぶことが重要です。</p>



<p class="wp-block-paragraph">この記事では、オブジェクト指向の詳細についてはこれ以上踏み込みませんが、興味があれば「<a href="https://www.amazon.co.jp/exec/obidos/asin/4822284654/nkhn37net04-22/" target="_blank" rel="noreferrer noopener"></a>オブジェクト指向でなぜ作るのか」という書籍が参考になります。</p>





<h2 class="wp-block-heading jinr-heading d--bold" id="クラスの定義">Python におけるクラスとメソッドの定義</h2>



<p class="wp-block-paragraph">Python でクラスを定義する際の基本構成は以下の通りです。例として、<code>Person</code> クラスを用いて説明します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Person:
    """人間クラス"""

    kind = "human"

    def __init__(
        self, first_name=None, last_name=None, sex=None, birthday=None
    ):
        self.first_name = first_name
        self.last_name = last_name
        self.sex = sex
        self.birthday = birthday

    def say_myname(self):
        print(f"私の名前は、{self.last_name} {self.first_name} です。")

    @staticmethod
    def say_hello(greeting):
        print(greeting)

    @classmethod
    def get_kind(cls):
        return cls.kind

    def __del__(self):
        print(f"{self.last_name} {self.first_name} : delete")


def main():
    # クラスからインスタンスを生成
    tanaka = Person("太郎", "田中", "male", "2000/1/1")
    # クラスのメソッドを呼び出し
    tanaka.say_hello("こんにちは")
    tanaka.say_myname()
    print("---")

    # 別のインスタンスを生成
    sato = Person("愛子", "佐藤", "female", "2001/9/1")
    sato.say_hello("こんばんは")
    sato.say_myname()
    print("---")

    # クラスメソッドの呼び出し
    print(Person.get_kind())
    print("---")


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
こんにちは
私の名前は、田中 太郎 です。
---
こんばんは
私の名前は、佐藤 愛子 です。
---
human
---
田中 太郎 : delete
佐藤 愛子 : delete</pre>



<h3 class="wp-block-heading jinr-heading d--bold" id="クラス定義">クラス定義</h3>



<p class="wp-block-paragraph">クラス名は「<code>CapitalizedWords</code> (<code>CapWords</code> または <code>CamelCase</code>)」という方式を使います（例: <code>Person</code>、<code>FormView</code>、<code>DbClient</code>）。</p>



<p class="wp-block-paragraph">また、Python 3 では「<code>class Person:</code>」「<code>class Person():</code>」「<code>class Person(object):</code>」のように記載できますが、いずれも <code>object</code> を継承しています。記法については各プロジェクトごとに統一しましょう。</p>



<p class="wp-block-paragraph">クラスの命名は PEP8 に従うのが一般的です。PEP8 の命名規則は「<a href="https://tech.nkhn37.net/python-pep8-naming-conventions/" target="_blank" rel="noreferrer noopener">コーディング規約 PEP8の命名規則</a>」を参考にしてください。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="クラスのメソッド">メソッド定義</h3>



<p class="wp-block-paragraph">クラス内の関数は「<span class="jinr-d--text-color d--marker1 d--bold">メソッド</span>」と呼びます。メソッドは以下のような種類があります。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="コンストラクタ">コンストラクタ</h4>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">コンストラクタ</span>は、インスタンス生成時に初期化を行うメソッドで「<code>def __init__(self, 入力引数, ...):</code>」のように定義します。インスタンス変数は「<code>self.変数名</code>」で定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    def __init__(
        self, first_name=None, last_name=None, sex=None, birthday=None
    ):
        self.first_name = first_name
        self.last_name = last_name
        self.sex = sex
        self.birthday = birthday</pre>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><code>self</code></span> は、インスタンス自身を指し、クラス内で定義されたメソッドにおいて、自身のインスタンス変数や他のメソッドにアクセスするために使用します。Python では、メソッドの最初の引数として <code>self</code> を指定することで、メソッドがどのインスタンスに対して呼ばれているかを明確にします。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="デストラクタ">デストラクタ</h4>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">デストラクタ</span>は、インスタンス破棄の際に実行されるメソッドで「<code>def __del__(self):</code>」というように定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    def __del__(self):
        print(f"{self.last_name} {self.first_name} : delete")</pre>



<p class="wp-block-paragraph">デストラクタは、例えばファイルや DB のリソース解放処理などを記載する際によく使用されます。</p>



<p class="wp-block-paragraph">なお、「<code>__init__</code>」や「<code>__del__</code>」のようにアンダースコア2個（<code>__</code>）で囲まれたメソッドは「<span class="jinr-d--text-color d--marker1 d--bold">特殊メソッド</span>」と言われます。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="メソッド">通常のメソッド</h4>



<p class="wp-block-paragraph">通常のメソッドは、関数と同様に「<code>def メソッド名(self):</code>」のように定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    def say_myname(self):
        print(f"私の名前は、{self.last_name} {self.first_name} です。")</pre>



<h4 class="wp-block-heading jinr-heading d--bold" id="クラスメソッド">クラスメソッド</h4>



<p class="wp-block-paragraph">メソッドの上に「<span class="jinr-d--text-color d--marker1 d--bold"><code>@classmethod</code></span>」デコレータを記載したメソッドを<span class="jinr-d--text-color d--marker1 d--bold">クラスメソッド</span>と言います。クラスメソッドは、インスタンスを生成しなくても「<code>クラス名.メソッド名(引数)</code>」で使用できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Person:
    """人間クラス"""

    kind = "human"

...(途中省略)...

    @classmethod
    def get_kind(cls):
        return cls.kind</pre>



<p class="wp-block-paragraph">通常のメソッドなどでは引数として <code>self</code> を受け取りますが、クラスメソッドの場合は、引数として <span class="jinr-d--text-color d--marker1 d--bold"><code>cls</code></span> を指定します。クラスメソッドは、クラスで共通変数（上記例では、<code>kind</code> のようなもの）にアクセスする場合に使用することがあります。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="スタティックメソッド">スタティックメソッド</h4>



<p class="wp-block-paragraph">メソッドの上に「<span class="jinr-d--text-color d--marker1 d--bold"><code>@staticmethod</code></span>」デコレータを記載したメソッドを<span class="jinr-d--text-color d--marker1 d--bold">スタティックメソッド</span>と言い、インスタンス変数にアクセスしないメソッドです。</p>



<p class="wp-block-paragraph">インスタンスの操作をしないため、クラスの外部で関数として定義することも可能ですが、機能の位置づけの分かりやすさなどを考慮して、必要に応じてクラス内にスタティックメソッドとして定義します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@staticmethod
def say_hello(greeting):
    print(greeting)</pre>



<h3 class="wp-block-heading jinr-heading d--bold" id="クラスのインスタンス化と使用方法">インスタンス化とメソッドの使用</h3>



<p class="wp-block-paragraph">ここからはインスタンス化とメソッドの使用方法を見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def main():
    # クラスからインスタンスを生成
    tanaka = Person("太郎", "田中", "male", "2000/1/1")
    # クラスのメソッドを呼び出し
    tanaka.say_hello("こんにちは")
    tanaka.say_myname()
    print("---")

    # 別のインスタンスを生成
    sato = Person("愛子", "佐藤", "female", "2001/9/1")
    sato.say_hello("こんばんは")
    sato.say_myname()
    print("---")

    # クラスメソッドの呼び出し
    print(Person.get_kind())
    print("---")</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】（再掲）
こんにちは
私の名前は、田中 太郎 です。
---
こんばんは
私の名前は、佐藤 愛子 です。
---
human
---
田中 太郎 : delete
佐藤 愛子 : delete</pre>



<p class="wp-block-paragraph">クラスのインスタンスは「<code>tanaka = Person("太郎", "田中", "male", "2000/1/1")</code>」のように生成します。メソッド呼び出しは「<code>tanaka.say_hello("こんにちは")</code>」、クラスメソッドは「<code>Person.get_kind()</code>」のように呼び出しできます。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="インスタンス変数の隠ぺい">インスタンス変数の隠ぺいとカプセル化</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">カプセル化</span>とは、外部からの不要なアクセスを防ぐためにインスタンス変数やメソッドを隠ぺいするオブジェクト指向における重要な考え方です。</p>



<p class="wp-block-paragraph">Python では、インスタンス変数を<span class="jinr-d--text-color d--marker1 d--bold">「<code>_</code>」（アンダースコア 1 個）</span>で始めることで非公開を意図します。ただし、Python ではこのアンダースコア 1 個の変数自体へのアクセスを制限する効力はなく、直接アクセス可能です。</p>



<p class="wp-block-paragraph">アンダースコア 1 個の変数にアクセスしないというのは、Pythonプログラマ間での約束事であり、強制力はありませんが、多くの Python プログラマは理解していることです。また、IDEによっては、アンダースコア 1 個の変数は、隠ぺいされているとして補完には表示されないように工夫されています。</p>



<p class="wp-block-paragraph">一方で、<span class="jinr-d--text-color d--marker1 d--bold">「<code>__</code>」（アンダースコア 2 個）</span>で始まるインスタンス変数は、外部からのアクセスできません。ただし、この方法も実は完全に隠ぺいされているわけではなく<span class="jinr-d--text-color d--marker1 d--bold">マングリング</span>というリネーム処理が行われています。</p>



<p class="wp-block-paragraph">以下の例で具体的に見ていきましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Person:
    """人間クラス"""

    kind = "human"

    def __init__(
        self, first_name=None, last_name=None, sex=None, birthday=None
    ):
        self.__first_name = first_name
        self.__last_name = last_name
        self._sex = sex
        self._birthday = birthday

    def say_myname(self):
        print(f"私の名前は、{self.__last_name} {self.__first_name} です。")


def main():
    tanaka = Person("太郎", "田中", "male", "2000/1/1")
    tanaka.say_myname()
    print(tanaka._sex)
    print(tanaka._birthday)
    # 隠ぺいされた変数へのアクセス
    print(tanaka.__first_name)


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果例】
私の名前は、田中 太郎 です。
male
2000/1/1
Traceback (most recent call last):
...(省略)...
AttributeError: 'Person' object has no attribute '__first_name'</pre>



<p class="wp-block-paragraph">上記例では　<code>tanaka._sex</code> や <code>tanaka._birthday</code> というアンダースコア 1 個の変数にはアクセスできていることが分かります。一方で <code>tanaka.__first_name</code> というアンダースコア 2 個の変数にはアクセスできずに <code>AttributeError</code> となります。</p>



<p class="wp-block-paragraph">では次に、以下のコードに変更して実行してみてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def main():
    tanaka = Person("太郎", "田中", "male", "2000/1/1")
    tanaka.say_myname()
    print(tanaka._sex)
    print(tanaka._birthday)
    # 隠ぺいされた変数へのアクセス
    # マングリングした名前
    print(tanaka._Person__first_name)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
私の名前は、田中 太郎 です。
male
2000/1/1
太郎</pre>



<p class="wp-block-paragraph">上記例では <code>tanaka._Person__first_name</code> とすることで <code>__first_name</code> 変数の値にアクセスができてしまっています。</p>



<p class="wp-block-paragraph">マングリングは、もともとの変数を「<code>_[クラス名][元の名前]</code>」という形式にリネームしているだけであるため、完全な隠ぺいをしているわけではありません。外部からアクセスされたくない変数に「<code>__</code>」（アンダースコア 2 個）をつけることは有効ですが、完全な隠ぺいではないということは理解しておきましょう。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python で<span class="jinr-d--text-color d--marker1 d--bold">クラスを定義方法と使い方</span>について解説しました。</p>



<p class="wp-block-paragraph">オブジェクト指向におけるクラスやメソッドの概念を説明し、Python における具体的な実装例を紹介しました。また、Python においてカプセル化がどのように扱われているのかも説明しました。</p>



<p class="wp-block-paragraph">オブジェクト指向プログラミングは、非常に重要なプログラミング技術の 1 つです。ぜひ、考え方も含めてしっかりと理解してもらいたいと思います。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/class/basics" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-class-definition/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-14 08:50:16 by W3 Total Cache
-->