Pythonにおけるオブジェクトとは?

## **オブジェクトとは？**
オブジェクトとは、**データ（値）とそれを操作するためのメソッド（関数）を持つプログラム上の「もの」** です。

Python では、**すべてのデータがオブジェクト** です。
- 文字列 (`str`)
- 数値 (`int`, `float`)
- リスト (`list`)
- 辞書 (`dict`)
- クラス (`class` で作成したインスタンス)
- モジュール (`import` したもの)

これらはすべてオブジェクトです。

---

## **オブジェクトの基本的な考え方**
オブジェクトには **「属性」** と **「メソッド」** があります。

### **1. 属性（データ）**
オブジェクトが持つ **情報（変数）** のこと。
```python
class Person:
    def __init__(self, name, age):
        self.name = name  # ← これが属性
        self.age = age    # ← これも属性

person = Person("Alice", 25)
print(person.name)  # "Alice"
print(person.age)   # 25
```
`person.name` や `person.age` は **オブジェクトの属性（データ）** です。

---

### **2. メソッド（関数）**
オブジェクトが持つ **機能（関数）** のこと。
```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):  # ← これがメソッド
        print(f"Hello, my name is {self.name} and I'm {self.age} years old.")

person = Person("Alice", 25)
person.greet()  
# Hello, my name is Alice and I'm 25 years old.
```
`greet()` は **オブジェクトのメソッド（機能）** です。

---

## **オブジェクトの特徴**
### **1. オブジェクトは「クラス」から作られる**
オブジェクトは **クラス（設計図）** から作られた実体（インスタンス）です。

```python
class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color

car1 = Car("Toyota", "Red")  # car1 は Car のオブジェクト（インスタンス）
car2 = Car("Honda", "Blue")  # car2 も Car のオブジェクト（インスタンス）

print(car1.brand)  # Toyota
print(car2.color)  # Blue
```
- `Car` クラスが **オブジェクトの設計図** で、`car1` や `car2` が **オブジェクト（インスタンス）**。

---

### **2. オブジェクトは「状態」と「振る舞い」を持つ**
オブジェクトは **状態（データ）** と **振る舞い（メソッド）** を持つ。

```python
class Dog:
    def __init__(self, name):
        self.name = name
        self.energy = 100  # ← 状態（データ）

    def bark(self):  # ← 振る舞い（メソッド）
        print(f"{self.name} is barking! Woof Woof!")
        self.energy -= 10  # 吠えるとエネルギーが減る

dog = Dog("Buddy")
dog.bark()
print(dog.energy)  # 90
```
- `dog.name` → **オブジェクトの「状態」**
- `dog.bark()` → **オブジェクトの「振る舞い」**

---

### **3. Pythonのすべてのデータはオブジェクト**
Python では、**数値や文字列、リストなどもオブジェクト** です。

```python
x = 10
print(x.real)  # 10（整数もオブジェクト！）

s = "Hello"
print(s.upper())  # "HELLO"（文字列オブジェクトのメソッド）
```
→ `x.real` や `s.upper()` は、**オブジェクトの属性やメソッド** を使っている例です。

---

## **オブジェクトを操作する関数**
Python にはオブジェクトを操作するための便利な関数があります。

| 関数 | 説明 |
|------|------|
| `type(obj)` | オブジェクトの型を取得 |
| `isinstance(obj, class)` | オブジェクトが特定のクラスかチェック |
| `dir(obj)` | オブジェクトの属性やメソッドを一覧表示 |
| `hasattr(obj, "attr")` | 指定した属性があるかチェック |
| `getattr(obj, "attr", default)` | 指定した属性の値を取得 |
| `setattr(obj, "attr", value)` | 指定した属性の値を設定 |

### **1. `type()`**
```python
print(type(10))  # <class 'int'>
print(type("Hello"))  # <class 'str'>
print(type([]))  # <class 'list'>
```
→ **オブジェクトの型を確認できる！**

---

### **2. `isinstance()`**
```python
x = 10
print(isinstance(x, int))  # True
print(isinstance(x, str))  # False
```
→ **オブジェクトが特定の型かどうか判定できる！**

---

### **3. `dir()`**
```python
print(dir("Hello"))
```
→ `"Hello"` のメソッド一覧が表示される。（`upper()`, `lower()`, `strip()` など）

---

### **4. `hasattr()`**
```python
class Sample:
    def __init__(self):
        self.name = "Alice"

obj = Sample()
print(hasattr(obj, "name"))  # True
print(hasattr(obj, "age"))  # False
```
→ **`name` はあるけど、`age` はない！**

---

## **まとめ**
| 用語 | 説明 |
|------|------|
| **オブジェクト** | データとメソッドを持つ「もの」。Pythonではすべてオブジェクト |
| **クラス** | オブジェクトの設計図 |
| **インスタンス** | クラスから作られた実体 |
| **属性（データ）** | オブジェクトが持つ情報 |
| **メソッド（関数）** | オブジェクトが持つ機能 |

**Python ではすべてがオブジェクト！**
- `int`, `str`, `list` なども **オブジェクト**
- `hasattr()` や `getattr()` でオブジェクトの属性を操作できる
- `dir()` でオブジェクトのメソッドを確認できる