ساخت آبجکت با نام دلخواه به صورت اتوماتیک در پایتون
درود
من در حال نوشتن یک برنامه ساعت مثل برنامه ساعت موبایل البته بدون GUI (کامند لاینی) با پایتون هستم.
همانطور که در موبایل کاربر میتواند برای خود آلارم های مختلف create کند و زمان و زنگ و تعویق و تکرار و... ش رو تنظیم کنه، میخوام برنامه من هم این قابلیت رو دارا باشد. برای این کار اومدم کلاس تعریف کردم و هر آلارمی رو به عنوان یک آبجکت از این کلاس در نظر گرفتم. عنوان یا title رو پیش از این از کاربر دریافت کرده و در کنار بقیه اتریبیوت ها در دیکشنری ای ذخیره کرده ام. درست لحظه نمونه سازی(ساخت آبجکت) نمیدانم چطور همان نامی که به عنوان title از کاربر گرفتم را به عنوان نام متغیر این آبجکت بگذارم.
5 پاسخ
تشکر از پاسخ شما
بسیار خب، مورد اول در قوانین نامگذاری را رعایت خواهم کرد. مشابه پیشنهاد شما، من هم یک کلاسی تعریف کردم که قراره داده های دریافتی از کاربر رو به attribute نظیر ش اختصاص بده. اما ابهام من دقیقا از جایی شروع میشه که میخواد این نمونه سازی یا instantiation انجام بشه. مثلا کاربر میاد ۳ تا آلارم برا خودش درست میکنه. اونوقت من چطور باید آبجکت ها رو بلافاصله برای هر آلارم ایجاد کنم؟ تو اون لحظه که نمیتونم تو سورس مثلا اینطوری بنویسم:
alarm1 = Alarm (title, time, occurrence, sound and...)
alarm2 = Alarm (title, time, occurrence, sound and ...(
alarm۳ = Alarm (title, time, occurrence, sound and...)
این ساخت آبجکت ها رو نمیدونم چطور باید انجام بدم.
ببینید در مثال شما نوع داده n عدد است و اعداد قابل تغییر هستند یعنی یک خانه حافظه را گرفته اید و عدد ۲ را در آن قرار داده اید حال بعدش میاید و توی همون خونه حافظه عدد ۳ را قرار می دهید پس عدد ۲ عملا رونویسی شده و از بین رفته است. اما این برای انواع داده های ساده مثل عدد و کاراکتر است و برای اشیا قضیه فرق دارد. (در مورد نوع داده mutable , unmutable سرچ کنید)
در اشیا وقتی یک شی ساخته می شود با توجه به داده هایی که در داخل آن به کار رفته چند خانه حافظه برای آن اشغال می شود . برای نام گذاری آن یک اشاره گر به آن درست می کنیم و نام آن را مثلا new_alarm قرار می دهیم. تا وقتی که این new_alarm حذف نشده باشد آن شی ما نیز در حافظه موجود است. حال می توانیم یک اشاره گر دیگر نیز به این شی بسازیم. الان ۲ تا اشاره گر داریم که به یک شی اشاره می کنند و اگر یکی تغییر کند دیگری هم تغییر می کند.
حالا در مثال بالا در تابع add_alarm ما یک شی ساخته ایم و نام آن(اشاره گر به آن) را new_alarm قرار داده ایم. از طرفی چون آن را به لیست اضافه می کنیم پس یکی از خانه های لیست هم به آن شی اشاره می کند و آن شی حذف نخواهد شد تا وقتی که لیست موجود باشد. اما اشاره گر new_alarm با تمام شدن اجرای تابع از بین می رود و وقتی که دوباره تابع add_alarm صدا زده می شود یک اشاره گر new_alarm جدید ساخته می شود که به new_alarm قبلی هیچ ربطی ندارد.
سلام دوست عزیز به کد زیر دقت کنید
class Alarm:
def __int__(self, title, time, occurrence, sound):
self.title = title
self.time = time
self.occurrence = occurrence
self.sound = sound
alarm_list = []
def add_alarm(title, time, occurrence, sound):
new_alarm = Alarm(title, time, occurrence, sound)
alarm_list.append(new_alarm)
لیست alarm_list لیست آلارم ها را نگهداری می کند.
هر بار که در زمان اجرای برنامه کاربر بخواهد یک آلارم جدید ایجاد کند باید تابع add_alarm صدا زده شود. در داخل این تابع یک آلارم جدید ساخته می شود و نام آن new_alarm گذاشته می شود و سپس این آلارم به لیست آلارم های ما اضافه می شود.
الان مشکل شما این است که آیا اسم همه آلارم های ما new_alarm است؟ و چگونه می توان هر بار یک آلارم با اسم new_alarm بسازیم. در جواب باید بگم که اسم ها فقط اشاره گر هایی به آبجکت های ما هستند. اگر آبجکت را به صورت یک فضا در رم کامپیوتر بدانیم اسم هایی که برای آنها در نظر میگیریم فقط به آن فضا اشاره می کنند. به همین خاطر یک آبجکت می تواند چند اسم هم داشته باشد. از طرفی در کد بالا در تابع add_alarm یک فضا در حافظه ایجاد می کنم و اسم آن را new_alarm قرار می دهم و سپس آن را به لیست اضافه می کنم. یعنی من یک فضا در حافظه دارم که هم با نام new_alarm می توانم به آن دسترسی داشته باشم و هم با اندیس لیست مثل alarm_list[3]. البته نکته مهم این است که هر بار تابع add_alarm صدا زده می شود یک new_alarm جدید ساخته می شود و وقتی که اجرای تابع تمام شد و برنامه به خط آخر تابع رسید اسم new_alarm حذف خواهد شد و در داخل برنامه دیگر وجود نخواهد داشت و فقط در داخل بدنه تابع می توان از آن استفاده کرد. اما لیست alarm_list چون داخل بدنه تابع نیست در کل برنامه وجود خواهد داشت و می توان با اندیس به آن دسترسی داشت.
الان مشکل شما این است که آیا اسم همه آلارم های ما new_alarm است؟... در جواب باید بگم که اسم ها فقط اشاره گر هایی به آبجکت های ما هستند... به همین خاطر یک آبجکت می تواند چند اسم هم داشته باشد...
مثال خوبی زدید. از اونجا که در مثال، تو اون تابع add_alarm ، پس از فراخونی تابع، اون متغییر new_alarm حذف میشه، یه چیزی رو نمیشه با این مثال نشون داد. تو مثال زیر، من دو متغییر عددی با نام 'n' درست میکنم:
>>> n = 2
>>> n = 3
>>> print(n)
3
بار دوم که یک آبجکت با نام n ساخته شد، انگاری رونویسی شد. حالا با فرض اینکه new_alarm مثال حذف نشه مثل بالا، چطور ممکنه این نام همزمان چند آبجکت باشه؟ رونویسی نمیشه؟
سلام به شما دوست عزیز
به این فکر کنید که کاربر نامی رو مشخص کنه در قوانین نامگذاری نتونید دقیقا همان نام رو برای آبجکت در نظر بگیرید. به نظر من این ایده قشنگ نیست که کاربر هر نامی رو انتخاب کرد رو به عنوان نام برنامه نویسی آبجکت بگذارید. در عوض پیشنهاد می کنم که یک کلاس برای نگهداری داده های کاربر (مثل عنوان و زمان و چند بار زنگ زدن و قابلیت به تعویق انداختن و ... و یک آیدی یکتا ) بسازید و هر بار که کاربر یک آلارم درست کرد یک نمونه از این کلاس بسازید و داده های آن را پر کنید و همه آلارم ها رو توی یک لیست قرار دهید و هر بار که آلارم جدیدی ساخته می شود فقط یک عنصر به لیست اضافه می شود.