DJANGOLEARN_IR Telegram 725
سلام دوستان امروز می خواهیم درباره ی 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:
   
    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
bject at 0x7f7371425748>                                                                                                     


     خب الان براتون سوال میشه که اصلا این dunder new به چکاری میاد؟ یا چجوری تونستیم که خود کلاس رو به کلاسی که ازش ارث برده بفرستیم در صورتی که هنوز خود کلاس ایجاد نشده !
خب بریم که به سوالات جواب بدیم :)

برای سوال اول بعضی موقع ها هست ما می خواهیم قدرت بیشتری رو در ساختن نمونه های کلاسمون رو داشته باشیم یا در واقع اصلا نگذاریم  اون نمونه از کلاس تشکیل بشه
مثل این مثال :

class Person:
   
    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


  خب در مثال
بالا ما گفتیم که قبل از اینکه نمونه از کلاس رو بسازی بیا و چک کن اگر سن اون آدم 16 و اسم اون parsa بود این  نمونه از کلاس رو نساز ( در واقع  با مقدار 16 و parsa   اون شی آدم نیست!)
البته این مثال برای طنز قضیه بود :)

خب حالا می رسیم به سوال دوم در پایتون متد type علاوه بر تشخیص یک شی وظیفه ایجاد کلاس رو هم داره (جالبه نه؟)

و موقعی که  داریم خود کلاس رو  وقتی ایجاد نشده به کلاسی که ازش ارث برده می فرستیم در واقع همون تایپ هست که این کار رو انجام میده

برای ایجاد یک کلاس با متد type اینگونه عمل می کنیم

my_class = type('Class_name', (), {})

print(my_class)

#output
<class 'main.Class_name'>    
 

  خب دیدن چه با حال بود :)  در قسمت اول اسم کلاس و در قسمت بعد  یک تاپل هست که کلاس هایی که قراره ازشون ارث ببره
و در قسمت آخر هم یک دیکشنری هست که خصوصیات اون کلاس رو به همراه داره
به همین راحتی !

اگر مفید بود به اشتراک بگذارید :)
👍12



tgoop.com/djangolearn_ir/725
Create:
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:
   
    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
bject at 0x7f7371425748>                                                                                                     


     خب الان براتون سوال میشه که اصلا این dunder new به چکاری میاد؟ یا چجوری تونستیم که خود کلاس رو به کلاسی که ازش ارث برده بفرستیم در صورتی که هنوز خود کلاس ایجاد نشده !
خب بریم که به سوالات جواب بدیم :)

برای سوال اول بعضی موقع ها هست ما می خواهیم قدرت بیشتری رو در ساختن نمونه های کلاسمون رو داشته باشیم یا در واقع اصلا نگذاریم  اون نمونه از کلاس تشکیل بشه
مثل این مثال :

class Person:
   
    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


  خب در مثال
بالا ما گفتیم که قبل از اینکه نمونه از کلاس رو بسازی بیا و چک کن اگر سن اون آدم 16 و اسم اون parsa بود این  نمونه از کلاس رو نساز ( در واقع  با مقدار 16 و parsa   اون شی آدم نیست!)
البته این مثال برای طنز قضیه بود :)

خب حالا می رسیم به سوال دوم در پایتون متد 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

View MORE
Open in Telegram


Telegram News

Date: |

‘Ban’ on Telegram 4How to customize a Telegram channel? How to Create a Private or Public Channel on Telegram? Add up to 50 administrators Telegram message that reads: "Bear Market Screaming Therapy Group. You are only allowed to send screaming voice notes. Everything else = BAN. Text pics, videos, stickers, gif = BAN. Anything other than screaming = BAN. You think you are smart = BAN.
from us


Telegram جنگولرن
FROM American