Goの構造体とPythonのクラスの違い
プログラミング言語には、それぞれ異なるデータ構造やオブジェクト指向の概念があります。
この記事では、Go言語の「構造体(struct)」とPythonの「クラス(class)」の違いについて情報を整理しました。
1. データとメソッドの組み合わせ
<Goの構造体>
Goの構造体は、データ(フィールド)を保持するためのカスタムデータ型。
構造体そのものにはメソッドを直接含めませんが、構造体型に対してメソッドを定義することができます。
type Person struct {
Name string
Age int
}
func (p *Person) Greet() string {
return "Hello, " + p.Name
}
<Pythonのクラス>
Pythonのクラスは、データ(属性)とその操作を行うメソッドを一つにまとめたもの。
クラス内でメソッドを定義し、インスタンスを通じてそれを呼び出すことができます。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"Hello, {self.name}"
p = Person("Alice", 30)
print(p.greet())
2. 継承
<Goの構造体>
Goの構造体は、クラスベースの継承をサポートしていない。
代わりに「埋め込み」や「コンポジション」を使用してコードの再利用を行います。
type Employee struct {
Person
EmployeeID string
}
<Pythonのクラス>
Pythonのクラスは継承をサポートしており、親クラスの機能を子クラスに引き継ぐことができる。
また、多重継承も可能です。
class Employee(Person):
def __init__(self, name, age, employee_id):
super().__init__(name, age)
self.employee_id = employee_id
3. ポリモーフィズム(多態性)
<Goの構造体>
Goでは、インターフェースを使ってポリモーフィズムを実現する。
インターフェースはメソッドの集合を定義し、それを実装する任意の構造体がそのインターフェースを満たすと見なされます。
type Greeter interface {
Greet() string
}
<Pythonのクラス>
Pythonでは、継承とメソッドのオーバーライドを使ってポリモーフィズムを実現する。
また、"duck typing"により、特定のインターフェースを持つ必要はないようです。
※duck typeing(ダックタイピング): メソッドや属性を利用することで、オブジェクトの型を決定するポリモーフィズム(多態性)を実現する手法の一つ
class Bird:
def fly(self):
print("Flying")
class Airplane:
def fly(self):
print("Flying high in the sky")
def take_off(flying_object):
flying_object.fly()
take_off(Bird()) # Output: Flying
take_off(Airplane()) # Output: Flying high in the sky
4. メモリ管理
<Goの構造体>
Goは静的型付け言語で、構造体のメモリはスタックまたはヒープに割り当てられる。
ガベージコレクタがメモリを管理し、必要に応じて自動的に解放します。
<Pythonのクラス>
Pythonは動的型付け言語であり、すべてのオブジェクトはヒープ上に作成される。
Pythonのガベージコレクタが不要になったオブジェクトを自動的に解放します。