オブジェクトの属性についてのメモ

### **`attr` や `hasattr` の意味**
`attr` や `hasattr` は **Python の組み込み関数** で、オブジェクトの属性を操作・確認するために使います。

---

## **1. `hasattr(object, attribute_name)`**
### **使い方**
- `hasattr(obj, "属性名")`  
- **オブジェクトが指定された属性を持っているか確認する**。
- `True` または `False` を返す。

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

obj = Sample()

# obj に 'name' 属性があるか？
print(hasattr(obj, "name"))  # True

# obj に 'age' 属性があるか？
print(hasattr(obj, "age"))  # False
```
この例では、`obj` に `name` 属性はあるので `True` を返し、`age` はないので `False` を返します。

---
### **実践的な使い方**
#### **オブジェクトに特定の属性があるかチェックしてから処理をする**
```python
if hasattr(obj, "name"):
    print(obj.name)
else:
    print("name属性は存在しません")
```
→ **存在しない属性にアクセスするとエラーになるので、`hasattr` を使うことで安全にチェックできる！**

---
## **2. `getattr(object, attribute_name, default_value)`**
### **使い方**
- `getattr(obj, "属性名", デフォルト値)`  
- **オブジェクトの指定した属性の値を取得する。もし属性がなければデフォルト値を返す**。

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

obj = Sample()

# obj の 'name' 属性を取得
print(getattr(obj, "name"))  # "Alice"

# obj の 'age' 属性を取得（存在しないのでデフォルト値を返す）
print(getattr(obj, "age", 25))  # 25
```
---
### **`getattr` vs `hasattr` の違い**
- `hasattr(obj, "属性名")` は **属性が存在するかどうか** を `True/False` で返す。
- `getattr(obj, "属性名", デフォルト値)` は **属性の値を取得** し、存在しなければデフォルト値を返す。

---

## **3. `setattr(object, attribute_name, value)`**
### **使い方**
- `setattr(obj, "属性名", 値)`  
- **オブジェクトの属性を動的に追加・変更する**。

### **例**
```python
class Sample:
    pass  # 何もないクラス

obj = Sample()

# obj に 'name' という属性を後から追加
setattr(obj, "name", "Alice")

print(obj.name)  # "Alice"
```
---
### **実践的な使い方**
#### **動的に属性を追加・変更**
```python
class Person:
    def __init__(self, name):
        self.name = name

obj = Person("Alice")

# "age" という属性を後から追加
setattr(obj, "age", 30)

print(obj.age)  # 30
```
→ **プログラムの途中で、オブジェクトに新しい属性を追加することができる！**

---

## **4. `delattr(object, attribute_name)`**
### **使い方**
- `delattr(obj, "属性名")`
- **オブジェクトの属性を削除する**。

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

obj = Sample()

# 'name' 属性を削除
delattr(obj, "name")

print(hasattr(obj, "name"))  # False
```
→ **`delattr` を使うと、属性を完全に削除できる！**

---

## **まとめ**
| 関数 | 説明 | 戻り値 |
|------|------|------|
| `hasattr(obj, "attr")` | オブジェクトがその属性を持っているか確認 | `True` / `False` |
| `getattr(obj, "attr", default)` | 属性の値を取得（なければデフォルト値） | 属性の値 / `default` |
| `setattr(obj, "attr", value)` | 属性を設定（動的に追加・変更） | なし |
| `delattr(obj, "attr")` | 属性を削除 | なし |

**どんなときに使う？**
✅ `hasattr` → **属性があるかチェック**（例: 安全にデータ取得）  
✅ `getattr` → **属性がなければデフォルト値を設定して取得**  
✅ `setattr` → **属性を動的に追加・変更**  
✅ `delattr` → **属性を削除**  

---

## **実際のコードでの `hasattr` の使い方**
### **なぜ `hasattr` を使うのか？**
あなたのコードでは、次のような記述がありました：
```python
if hasattr(account_instance, "meiho_oid"):
    oid = account_instance.meiho_oid
```
- **`account_instance` に `meiho_oid` という属性があるかわからない**
- 存在しない属性にアクセスすると `AttributeError` になってしまう
- `hasattr` を使うことで、 **属性が存在するか事前にチェック** できるので、安全にプログラムが実行できる！

---

## **補足**
- `hasattr` は **内部的には `getattr(obj, attr, None) is not None` とほぼ同じ**。
- `getattr(obj, "attr", None)` を使って `None` かどうか判定する方法もある。

---

### **結論**
🔹 `hasattr()` はオブジェクトの属性が存在するかをチェックするために使う！  
🔹 `getattr()` は属性の値を取得し、存在しない場合にデフォルト値を返せる！  
🔹 `setattr()` は動的にオブジェクトに新しい属性を追加・変更できる！  
🔹 `delattr()` はオブジェクトの属性を削除できる！  

🚀 **オブジェクトの動的操作をするときに便利な関数！**