رفع خطاهای پایتون

خطای AttributeError در پایتون؛ object has no attribute یعنی چه؟

خطای AttributeError در پایتون؛ object has no attribute یعنی چه؟

🗓 آخرین به‌روزرسانی:

وقتی متدی مثل append را روی رشته صدا بزنید یا روی مقداری که None است متدی اجرا کنید، پایتون خطای AttributeError می‌دهد. پیام این خطا همیشه نوع شیء و نام ویژگی را می‌گوید؛ مثلاً 'str' object has no attribute 'append'. همین دو اطلاعات کلید رفع مشکل است.

معنی خطای AttributeError در پایتون

در پایتون همه‌چیز شیء است و هر نوع شیء ویژگی‌ها (Attribute) و متدهای مشخصی دارد. لیست append دارد، اما رشته ندارد. AttributeError یعنی با نقطه (obj.name) سراغ چیزی رفته‌اید که برای آن نوع شیء تعریف نشده است. رایج‌ترین حالت 'NoneType' object has no attribute است؛ یعنی متغیر شما برخلاف انتظار None است.

علت‌های رایج این خطا

  • استفاده از متد یک نوع داده روی نوع دیگر (مثل append روی رشته).
  • غلط تایپی در نام متد، مثل .uppper().
  • ریختن خروجی متدهایی مثل list.sort() یا list.append() در متغیر؛ این متدها None برمی‌گردانند.
  • تابعی که در برخی شرایط return ندارد و None برمی‌گرداند.
  • نام‌گذاری فایل با نام یک ماژول استاندارد (مثل random.py) که باعث import شدن فایل خودتان می‌شود.

کد غلط و کد درست (با خروجی واقعی)

همه نمونه‌کدهای زیر با پایتون 3.13.5 اجرا شده‌اند و خروجی‌ها همان چیزی است که پایتون واقعاً نمایش می‌دهد.

مثال 1: متد لیست روی رشته

❌ کد غلط:

names = "Ali"
names.append("Sara")

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 2, in <module>
    names.append("Sara")
    ^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'append'

✅ کد درست:

names = ["Ali"]
names.append("Sara")
print(names)

خروجی:

['Ali', 'Sara']

مثال 2: خروجی sort() برابر None است

❌ کد غلط:

nums = [3, 1, 2]
nums = nums.sort()
print(nums.count(1))

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 3, in <module>
    print(nums.count(1))
          ^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'count'

✅ کد درست:

nums = [3, 1, 2]
nums.sort()            # sorts in place
print(nums)
print(sorted([3, 1, 2]))  # returns a new list

خروجی:

[1, 2, 3]
[1, 2, 3]

مثال 3: غلط تایپی در نام متد

❌ کد غلط:

text = "python"
print(text.uppper())

خروجی:

Traceback (most recent call last):
  File "/home/user/project/main.py", line 2, in <module>
    print(text.uppper())
          ^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'uppper'. Did you mean: 'upper'?

✅ کد درست:

text = "python"
print(text.upper())

خروجی:

PYTHON

راه‌حل قدم‌به‌قدم

  1. نوع شیء را از پیام خطا بخوانید (بخش داخل کوتیشن اول) و با type(obj) تأیید کنید.
  2. با dir(obj) فهرست ویژگی‌ها و متدهای واقعی آن شیء را ببینید.
  3. اگر نوع شیء NoneType است، عقب بروید و ببینید مقدار متغیر کجا None شده است.
  4. املای نام متد را بررسی کنید؛ پایتون ۳.۱۰ به بعد معمولاً پیشنهاد Did you mean می‌دهد.
  5. اگر خطا درباره ماژول است، مطمئن شوید فایلی هم‌نام با آن ماژول در پوشه پروژه ندارید.

خواندن پیام AttributeError و عیب‌یابی

AttributeError یعنی روی یک شیء ویژگی یا متدی را صدا زده‌اید که آن شیء ندارد. پیام خطا نوع شیء و نام ویژگی را می‌گوید، مثل 'list' object has no attribute 'push'. پایتون 3.13 در بسیاری موارد پیشنهاد Did you mean هم می‌دهد که اغلب دقیقاً همان نامی است که می‌خواستید.

دو حالت را جدا کنید: یا نام ویژگی اشتباه است (غلط املایی یا متد زبان دیگر)، یا نوع شیء آن چیزی نیست که فکر می‌کنید. حالت دوم بسیار رایج است، مخصوصاً NoneType object has no attribute که یعنی متغیر None است. با type و dir روی شیء، نوع و ویژگی‌های موجود را ببینید.

دیدن نوع شیء و متدهای مشابه

items = [3, 1, 2]

try:
    items.push(4)
except AttributeError as error:
    print(type(error).__name__, "-", error)

print("Type:", type(items).__name__)
print("Similar:", [m for m in dir(items) if m.startswith("app")])
items.append(4)
print("Items:", items)

result = items.sort()
print("sort() returns:", result)

خروجی (اجراشده با Python 3.13):

AttributeError - 'list' object has no attribute 'push'
Type: list
Similar: ['append']
Items: [3, 1, 2, 4]
sort() returns: None

قدم‌به‌قدم رفع AttributeError

پیام خطا نوع شیء و نام ویژگی را می‌دهد؛ هر دو را جداگانه بررسی کنید.

  1. نوع شیء را تأیید کنید: اگر نوع با انتظار شما فرق دارد (مثلاً NoneType به جای list)، مشکل در مقداردهی است نه در نام متد.
  2. پیشنهاد پایتون را بخوانید: عبارت Did you mean در پایتون 3.13 اغلب نام درست را می‌گوید.
  3. ویژگی‌های موجود را ببینید: با dir(obj) یا help(type(obj)) متدهای واقعی را فهرست کنید.
  4. تداخل نام را بررسی کنید: برای module has no attribute، module.__file__ را چاپ کنید تا فایل هم‌نام را پیدا کنید.
  5. مقداردهی کلاس را چک کنید: اگر شیء از کلاس خودتان است، مطمئن شوید ویژگی در __init__ تعریف شده و املای self درست است.

چک‌لیست پیشگیری

  • متدهای هر نوع داده را با dir یا help بررسی کنید؛ متدهای جاوااسکریپت مثل push در پایتون وجود ندارند.
  • مراقب متدهایی باشید که None برمی‌گردانند و نتیجه آن‌ها را دوباره در متغیر نریزید.
  • در کلاس‌ها همه ویژگی‌ها را در __init__ مقداردهی اولیه کنید.
  • برای ویژگی‌های اختیاری از getattr(obj, 'name', default) استفاده کنید.
  • نام فایل‌هایتان را هم‌نام ماژول‌ها نگذارید؛ وگرنه module has no attribute می‌گیرید.

📌 همچنین بخوانید: خطای unexpected EOF while parsing در پایتون، خطای ‘int’ object is not subscriptable در پایتون و خطای ImportError

سؤالات متداول

پیام module has no attribute یعنی چه؟

یعنی ماژول آن تابع را ندارد؛ یا نام تابع اشتباه است، یا نسخه کتابخانه فرق دارد، یا فایلی هم‌نام با ماژول (مثلاً math.py) در پوشه شماست که به جای ماژول اصلی import می‌شود.

چطور از NoneType has no attribute جلوگیری کنم؟

قبل از استفاده بررسی کنید if obj is not None: و مطمئن شوید توابع شما در همه مسیرها مقدار return می‌کنند.

آیا می‌توانم به یک شیء ویژگی جدید اضافه کنم؟

برای اشیای کلاس‌های خودتان بله (obj.x = 1)، اما برای انواع داخلی مثل str و int خیر.

module has no attribute یعنی چه؟

یا تابع در آن نسخه ماژول وجود ندارد، یا فایل خودتان هم‌نام ماژول است و به جای ماژول واقعی import شده است.

NoneType object has no attribute را چطور رفع کنم؟

مقدار None از جایی آمده که چیزی برنگردانده؛ مثلاً re.match که مطابقتی پیدا نکرده. قبل از استفاده، if result is not None را بررسی کنید.

hasattr بهتر است یا try/except؟

هر دو درست‌اند؛ try/except AttributeError در پایتون رایج‌تر است و شرایط رقابتی را هم پوشش می‌دهد.

آموزش‌های مرتبط

آموزش‌های تازه، کد آماده و رفع خطاهر هفته در کانال Dev Source؛ رایگان.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *