tgoop.com/djangolearn_ir/725
Last Update:
سلام دوستان امروز می خواهیم درباره ی dunder new صحبت کنیم ، dunder new یک special method (یک class method هم هست پس اولین مقدارش خود کلاسه)
در پایتون هست که در واقع سازنده اصلی نمونه ها از کلاس این متد هست :)
خیلی جاها شنیدیم کهconstructor ، dunder init هست ولی dunder init فقط یک initializer هست و در واقع constructor اصلی dunder new هست
جالبه بدونید که dunder new قبل از ساخته شدن کامل یک نمونه کلاس و حتی قبل از dunder init کال میشه :)
اگر می خواهیم dunder new رو برای خودمون تغییر بدیم باید حواسمون باشه که این کار رو انجام بدیمreturn super().new(cls)
ک نمونه از اون کلاس ساخته بشه ساخته بشه
تا ی
خب حالا بریم حرفمون رو اثبات کنیم :class Test:
bject at 0x7f7371425748>
def init(self):
print("Hi i'm in dunder init")
def new(cls):
print("Hi i'm in dunder new")
return super().new(cls)
t1 = Test()
print(t1)
#output
Hi i'm in dunder new
Hi i'm in dunder init
<main.Test o
خب الان براتون سوال میشه که اصلا این dunder new به چکاری میاد؟ یا چجوری تونستیم که خود کلاس رو به کلاسی که ازش ارث برده بفرستیم در صورتی که هنوز خود کلاس ایجاد نشده !
خب بریم که به سوالات جواب بدیم :)
برای سوال اول بعضی موقع ها هست ما می خواهیم قدرت بیشتری رو در ساختن نمونه های کلاسمون رو داشته باشیم یا در واقع اصلا نگذاریم اون نمونه از کلاس تشکیل بشه
مثل این مثال :class Person:
بالا ما گفتیم که قبل از اینکه نمونه از کلاس رو بسازی بیا و چک کن اگر سن اون آدم 16 و اسم اون parsa بود این نمونه از کلاس رو نساز ( در واقع با مقدار 16 و parsa اون شی آدم نیست!)
def init(self, age, name):
self.age = age
self.name = name
def new(cls, age, name):
if age == 16 and name == 'parsa':
return None
return super().new(cls)
p1 = Person(16 , 'parsa')
print(p1)
#output
None
خب در مثال
البته این مثال برای طنز قضیه بود :)
خب حالا می رسیم به سوال دوم در پایتون متد type علاوه بر تشخیص یک شی وظیفه ایجاد کلاس رو هم داره (جالبه نه؟)
و موقعی که داریم خود کلاس رو وقتی ایجاد نشده به کلاسی که ازش ارث برده می فرستیم در واقع همون تایپ هست که این کار رو انجام میده
برای ایجاد یک کلاس با متد type اینگونه عمل می کنیمmy_class = type('Class_name', (), {})
print(my_class)
#output
<class 'main.Class_name'>
خب دیدن چه با حال بود :) در قسمت اول اسم کلاس و در قسمت بعد یک تاپل هست که کلاس هایی که قراره ازشون ارث ببره
و در قسمت آخر هم یک دیکشنری هست که خصوصیات اون کلاس رو به همراه داره
به همین راحتی !
اگر مفید بود به اشتراک بگذارید :)
BY جنگولرن
Share with your friend now:
tgoop.com/djangolearn_ir/725