الدرس 10 من 20

الدوال والفئات

الفئات والكائنات

3 دقيقة للقراءة

الفئات تتيح لك تجميع البيانات والوظائف معاً. أُطر الذكاء الاصطناعي مثل LangChain تستخدم الفئات بشكل مكثف للوكلاء والأدوات والذاكرة.

بنية الفئة الأساسية

class Agent:
    """وكيل ذكاء اصطناعي بسيط."""

    def __init__(self, name, model):
        """تهيئة الوكيل."""
        self.name = name    # سمة المثيل
        self.model = model
        self.history = []   # كل مثيل له سجله الخاص

    def chat(self, message):
        """إرسال رسالة والحصول على استجابة."""
        self.history.append({"role": "user", "content": message})
        response = f"[{self.name}]: استلمت رسالتك."
        self.history.append({"role": "assistant", "content": response})
        return response

# إنشاء المثيلات
agent1 = Agent("Claude", "claude-3-opus")
agent2 = Agent("GPT", "gpt-4")

# استخدام المثيل
response = agent1.chat("مرحباً!")
print(agent1.history)

معامل self

self يشير إلى المثيل الحالي. هكذا تصل الطرق إلى بيانات المثيل:

class Counter:
    def __init__(self):
        self.count = 0  # ينتمي لهذا المثيل

    def increment(self):
        self.count += 1  # الوصول عبر self

    def get_count(self):
        return self.count

c1 = Counter()
c2 = Counter()

c1.increment()
c1.increment()
print(c1.get_count())  # 2
print(c2.get_count())  # 0 (مثيل منفصل)

سمات الفئة مقابل سمات المثيل

class Model:
    # سمة الفئة (مشتركة بين جميع المثيلات)
    api_version = "v1"

    def __init__(self, name):
        # سمة المثيل (فريدة لكل مثيل)
        self.name = name

m1 = Model("gpt-4")
m2 = Model("claude")

print(m1.api_version)  # "v1"
print(m2.api_version)  # "v1"
print(m1.name)         # "gpt-4"
print(m2.name)         # "claude"

مثال عملي: فئة الأداة

class Tool:
    """فئة أساسية لأدوات الوكيل."""

    def __init__(self, name, description):
        self.name = name
        self.description = description

    def execute(self, **kwargs):
        raise NotImplementedError("يجب على الفئات الفرعية تنفيذ execute()")

class SearchTool(Tool):
    """أداة بحث في الويب."""

    def __init__(self):
        super().__init__(
            name="web_search",
            description="البحث في الويب عن معلومات"
        )

    def execute(self, query):
        # التنفيذ الفعلي للبحث سيكون هنا
        return f"نتائج البحث عن: {query}"

# الاستخدام
search = SearchTool()
result = search.execute(query="دروس بايثون")

الطرق الخاصة

class Message:
    def __init__(self, role, content):
        self.role = role
        self.content = content

    def __str__(self):
        """تمثيل نصي قابل للقراءة البشرية."""
        return f"{self.role}: {self.content}"

    def __repr__(self):
        """تمثيل ملائم للمطور."""
        return f"Message(role='{self.role}', content='{self.content}')"

msg = Message("user", "مرحباً")
print(msg)        # "user: مرحباً" (يستخدم __str__)
print(repr(msg))  # "Message(role='user', content='مرحباً')"

بعد ذلك، سنتعلم عن dataclasses—طريقة أبسط لتعريف فئات تحمل البيانات. :::

اختبار

الوحدة 3: الدوال والفئات

خذ الاختبار