خطای 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راهحل قدمبهقدم
- نوع شیء را از پیام خطا بخوانید (بخش داخل کوتیشن اول) و با
type(obj)تأیید کنید. - با
dir(obj)فهرست ویژگیها و متدهای واقعی آن شیء را ببینید. - اگر نوع شیء
NoneTypeاست، عقب بروید و ببینید مقدار متغیر کجاNoneشده است. - املای نام متد را بررسی کنید؛ پایتون ۳.۱۰ به بعد معمولاً پیشنهاد
Did you meanمیدهد. - اگر خطا درباره ماژول است، مطمئن شوید فایلی همنام با آن ماژول در پوشه پروژه ندارید.
خواندن پیام 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
پیام خطا نوع شیء و نام ویژگی را میدهد؛ هر دو را جداگانه بررسی کنید.
- نوع شیء را تأیید کنید: اگر نوع با انتظار شما فرق دارد (مثلاً NoneType به جای list)، مشکل در مقداردهی است نه در نام متد.
- پیشنهاد پایتون را بخوانید: عبارت Did you mean در پایتون 3.13 اغلب نام درست را میگوید.
- ویژگیهای موجود را ببینید: با dir(obj) یا help(type(obj)) متدهای واقعی را فهرست کنید.
- تداخل نام را بررسی کنید: برای module has no attribute، module.__file__ را چاپ کنید تا فایل همنام را پیدا کنید.
- مقداردهی کلاس را چک کنید: اگر شیء از کلاس خودتان است، مطمئن شوید ویژگی در __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 در پایتون رایجتر است و شرایط رقابتی را هم پوشش میدهد.
آموزشهای مرتبط
- متدهای رشته در پایتون
- لیستها در پایتون
- کلاس و شیء در پایتون
- آموزش جامع پایتون از صفر تا پیشرفته
- همه خطاهای رایج پایتون و راهحل آنها