در این مطلب، ویدئو __new__ در مقابل __init__ در پایتون با زیرنویس فارسی را برای دانلود قرار داده ام. شما میتوانید با پرداخت 15 هزار تومان ، این ویدیو به علاوه تمامی فیلم های سایت را دانلود کنید.اکثر فیلم های سایت به زبان انگلیسی می باشند. این ویدئو دارای زیرنویس فارسی ترجمه شده توسط هوش مصنوعی می باشد که میتوانید نمونه ای از آن را در قسمت پایانی این مطلب مشاهده کنید.
مدت زمان فیلم: 00:10:50
تصاویر این ویدئو:
قسمتی از زیرنویس این فیلم:
00:00:00,310 –> 00:00:01,310
درود و خوش آمد.
2
00:00:01,310 –> 00:00:02,380
من جیمز مورفی هستم.
3
00:00:02,380 –> 00:00:06,600
در این ویدیو، ما قصد داریم در مورد
یکی از
4
00:00:06,600 –> 00:00:13,010
اشتباهترین ویژگیهای پایتون، متد دابل underscore یا dunder __new___
یک کلاس و تفاوت آن با روش __init__ صحبت
5
00:00:13,010 –> 00:00:14,010
کنیم.
6
00:00:14,010 –> 00:00:17,500
قبل از اینکه به این آموزش برنامه نویسی بپردازیم،
اگر فردی به موضوعات برنامه نویسی فنی علاقه مند هستید
7
00:00:17,500 –> 00:00:22,089
، می دانم که قبلاً به
ساخت وب سایت خود فکر کرده اید، بنابراین
8
00:00:22,089 –> 00:00:26,449
لطفاً برای
همه نیازهای میزبانی وب خود، اسپانسر این ویدیو هاستینگر را در نظر بگیرید.
9
00:00:26,449 –> 00:00:29,119
طرح میزبانی اشتراکی Premium Hostinger را امتحان کنید.
10
00:00:29,119 –> 00:00:31,039
با نام دامنه رایگان همراه است. با پشتیبانی داخلی وردپرس آنها
11
00:00:31,039 –> 00:00:35,570
می توانید در کمترین زمان یک وبلاگ وردپرس راه اندازی کنید
.
12
00:00:35,570 –> 00:00:40,740
شما صد آدرس ایمیل رایگان در
نام دامنه جدید خود دریافت می کنید و همه اینها
13
00:00:40,740 –> 00:00:43,110
دارای 30 روز ضمانت بازگشت پول هستند.
14
00:00:43,110 –> 00:00:47,640
روی پیوند در توضیحات کلیک کنید و از
کد کوپن MCODING با تمام حروف در هنگام پرداخت استفاده
15
00:00:47,640 –> 00:00:51,360
کنید تا 91٪ تخفیف برای همه برنامه های سالانه دریافت کنید.
16
00:00:51,360 –> 00:00:56,080
هر دو __new__ و __init__ بخشی از
فرآیند ساخت یک شی هستند.
17
00:00:56,080 –> 00:01:00,390
وقتی میخواهید نمونهای از یک کلاس ایجاد کنید، هر دوی آنها فراخوانی میشوند
.
18
00:01:00,390 –> 00:01:05,670
در این حالت، میبینیم که متد جدید
با کلاس A فراخوانی میشود، و سپس آرگومانها
19
00:01:05,670 –> 00:01:10,369
و آرگومانهای کلمه کلیدی، در حالی
که متد __init__ یک نمونه واقعی از
20
00:01:10,369 –> 00:01:13,759
[کلاس] و سپس همان آرگومانها و آرگومانهای کلمه کلیدی
را دریافت میکند.
21
00:01:13,759 –> 00:01:18,630
در اینجا تقریباً اتفاقی می افتد که شما
واقعاً یک خط کد مانند این را اجرا می کنید.
22
00:01:18,630 –> 00:01:22,890
ابتدا متد __new__ با
آرگومان های داده شده و آرگومان های کلمه کلیدی فراخوانی می شود.
23
00:01:22,890 –> 00:01:28,979
سپس، اگر شیء برگشتی نوع صحیحی داشته
باشد، ادامه داده و متد __init__ را
24
00:01:28,979 –> 00:01:29,979
فراخوانی می کند.
25
00:01:29,979 –> 00:01:33,490
بنابراین این واقعاً به
تفاوت بین __new__ و __init__ اشاره می کند.
26
00:01:33,490 –> 00:01:39,969
__new__ مسئول ایجاد و
برگرداندن شی واقعی است، در حالی که __init__
27
00:01:39,969 –> 00:01:43,639
مسئول مقداردهی اولیه آن، تنظیم مقادیر پیش فرض
و مواردی از این دست است.
28
00:01:43,639 –> 00:01:46,990
ما می توانیم با نگاه کردن به انواع بازگشت این موضوع را بیشتر تأیید کنیم
.
29
00:01:46,990 –> 00:01:51,520
_new__ در واقع قرار است چیزی،
یک شی را برگرداند، در حالی که __init__ چیزی را بر نمی گرداند
30
00:01:51,520 –> 00:01:52,520
.
31
00:01:52,520 –> 00:01:54,020
فقط مقادیر را مقداردهی اولیه می کند.
32
00:01:54,020 –> 00:01:57,289
این توضیح میدهد که چرا چیزی
از __init__ برنمیگردانید.
33
00:01:57,289 –> 00:01:59,819
وظیفه __new__ آن
این است که در واقع شی جدید را بسازد.
34
00:01:59,819 –> 00:02:05,710
این یک متد کلاس است، بنابراین کلاسی را
که قرار است نمونه ای از آن را برگرداند، می گیرد
35
00:02:05,710 –> 00:02:08,560
و سپس باید نمونه ای از
آن کلاس را برگرداند.
36
00:02:08,560 –> 00:02:13,580
اکنون توجه داشته باشید که به دلیل این
بررسی ininstance، متد __init__ فقط در صورتی فراخوانی می شود
37
00:02:13,580 –> 00:02:16,610
که واقعاً یک شی از
نوع داده شده را برگرداند.
38
00:02:16,610 –> 00:02:21,050
اگر نوع نامناسبی از شیء را از
__new__ برگردانم، آنگاه فقط یک شیء بدون مقدار اولیه باقی میمانم
39
00:02:21,050 –> 00:02:23,400
و __init__ هرگز فراخوانی نمیشود.
40
00:02:23,400 –> 00:02:27,340
ما میتوانیم این اتفاق را با کامنت گذاشتن روی
خط بازگشت ببینیم تا None را برگرداند.
41
00:02:27,340 –> 00:02:31,680
اکنون می بینیم که __new__ فراخوانی شد، اما
__init__ هرگز فراخوانی نشد و مقدار x None است.
42
00:02:31,680 –> 00:02:35,760
این می تواند واقعا آزاردهنده باشد، بنابراین همیشه به یاد داشته باشید
که چیزی را از __new__ برگردانید.
43
00:02:35,760 –> 00:02:36,760
کارش همینه
44
00:02:36,760 –> 00:02:40,209
من می توانم بگویم که بیشتر برنامه نویسان پایتون
نسبتاً زود در مورد __init__ یاد می گیرند.
45
00:02:40,209 –> 00:02:44,180
تقریباً به محض اینکه آنها در مورد کلاس
ها یاد می گیرند، شما در مورد __init__ و نحوه ایجاد
46
00:02:44,180 –> 00:02:46,610
کلاس های خود که ویژگی های خاص خود را دارند یاد می گیرید.
47
00:02:46,610 –> 00:02:51,130
اما یادگیری در مورد __جدید__
چیزی است که معمولاً تا خیلی، خیلی دیرتر و
48
00:02:51,130 –> 00:02:52,349
گاهی حتی سالها مطرح نمی شود.
49
00:02:52,349 –> 00:02:57,290
بنابراین، چه زمانی نیاز دارید که واقعاً
نحوه ایجاد شیء را به جای
50
00:02:57,290 –> 00:02:58,500
نحوه اولیه سازی آن تغییر دهید؟
51
00:02:58,500 –> 00:03:05,310
__new__ به پایتون اضافه شد، در درجه اول به
برنامه نویسان اجازه می دهد تا انواع غیرقابل تغییر داخلی را زیرکلاس کنند
52
00:03:05,310 –> 00:03:06,319
.
53
00:03:06,319 –> 00:03:09,270
فرض کنید که من می خواهم یک تایپ با حروف بزرگ
بسازم.
54
00:03:09,270 –> 00:03:13,450
این دقیقاً همان
تاپل خواهد بود، با این تفاوت که هر زمان یکی را ایجاد کردید،
55
00:03:13,450 –> 00:03:15,390
همیشه آرگومانهایش را با حروف بزرگ مینویسد.
56
00:03:15,390 –> 00:03:19,239
ممکن است وسوسه شوید که این کار را
با استفاده از تابع __init__ انجام دهید.
57
00:03:19,239 –> 00:03:21,500
شما یک تکرارپذیر را به عنوان آرگومان آن در نظر می گیرید.
58
00:03:21,500 –> 00:03:25,880
شما می خواهید از طریق آن چیزها حلقه بزنید
، چیز it و تاپل را به
59
00:03:25,880 –> 00:03:28,299
نسخه بزرگ آن آرگومان تغییر دهید.
60
00:03:28,299 –> 00:03:31,439
اما وقتی کد را اجرا می کنیم، می بینیم که
کار نمی کند.
61
00:03:31,439 –> 00:03:34,530
زمانی که __init__ نامیده می شود، دیگر
دیر شده است.
62
00:03:34,530 –> 00:03:38,310
شی از قبل وجود دارد و نمی توان آن را
تغییر داد.
63
00:03:38,310 –> 00:03:43,730
تنها راه ممکن برای دور زدن این موضوع،
رهگیری و اصلاح آرگومان ها قبل
64
00:03:43,730 –> 00:03:45,750
از ایجاد شی است.
65
00:03:45,750 –> 00:03:47,659
این را می توان با استفاده از __new__ انجام داد.
66
00:03:47,659 –> 00:03:50,950
در اینجا همان تکراری
را که در __init__ میگرفتیم، میگیریم و سپس
67
00:03:50,950 –> 00:03:52,090
آرگومانها را اصلاح میکنیم.
68
00:03:52,090 –> 00:03:55,999
ما در اینجا یک مولد ایجاد میکنیم
که یک تکرار شونده جدید است که تمام
69
00:03:55,999 –> 00:04:00,859
رشتههایی را که میبیند، با حروف بزرگ مینویسد، و سپس ادامه میدهیم
و آن تکرارپذیر جدید را به کلاس تاپل ارسال میکنیم.
70
00:04:00,859 –> 00:04:03,689
سپس به یک تاپل با حروف بزرگ واقعی می رسیم.
71
00:04:03,689 –> 00:04:08,420
باز هم، این فقط امکان پذیر است زیرا ما در حال
اصلاح آرگومان ها قبل از اینکه این
72
00:04:08,420 –> 00:04:10,140
چیز تغییرناپذیر واقعاً ایجاد شود، هستیم.
73
00:04:10,140 –> 00:04:12,370
حالا، وقتی مثال را اجرا می کنیم، کار می کند.
74
00:04:12,370 –> 00:04:17,548
ما “hi” و “there” را با حروف کوچک داریم و
وقتی چاپ شد، “HI” و “THERE” بزرگ داریم
75
00:04:17,548 –> 00:04:18,548
.
76
00:04:18,548 –> 00:04:23,190
ممکن است از خود بپرسید که در موردی مانند این،
چرا به جای ارث بردن از tuple، کلاسی ایجاد نکنم که حاوی
77
00:04:23,190 –> 00:04:25,650
یک تاپل باشد؟
78
00:04:25,650 –> 00:04:27,660
و این نکته بسیار معتبری است.
79
00:04:27,660 –> 00:04:31,210
دلیل، حداقل برای موردی مانند این،
عملکرد خواهد بود.
80
00:04:31,210 –> 00:04:35,009
مطمئناً میتوانید یک شیء پراکسی بسازید که
آرگومانها را با حروف بزرگ نوشته و سپس
81
00:04:35,009 –> 00:04:38,020
همه فراخوانیهای متد خود را به تاپل زیرین فوروارد کند
.
82
00:04:38,020 –> 00:04:41,690
با این حال، انجام این کار به طور قابل توجهی
بر عملکرد تأثیر می گذارد.
83
00:04:41,690 –> 00:04:47,639
Tuple یک شی پایتون داخلی است که در درجه اول به
زبان C نوشته شده است. زیرا با زبان C نوشته شده است
84
00:04:47,639 –> 00:04:50,940
که سرعت آن را از هر کد پایتونی
که می توانید بنویسید بسیار بیشتر می کند.
85
00:04:50,940 –> 00:04:55,890
بنابراین، اگر شما یک wrapper در اطراف آن
بنویسید، تمام تماسها را پراکسی میکند، آن wrapper
86
00:04:55,890 –> 00:04:59,540
در پایتون نوشته میشود و
عملکرد قابل توجهی خواهد داشت.
87
00:04:59,540 –> 00:05:04,370
همچنین برای
هر نوع نوشته شده به عنوان پسوند C در وضعیت مشابهی قرار خواهید داشت.
88
00:05:04,370 –> 00:05:06,780
در اینجا روش جالب دیگری وجود دارد که
می توان از __new__ استفاده کرد.
89
00:05:06,780 –> 00:05:08,639
الگوهای طراحی خلاقانه
90
00:05:08,639 –> 00:05:12,460
در اینجا پیاده سازی چیزی است که به
آن الگوی طراحی تک تنه می گویند.
91
00:05:12,460 –> 00:05:16,690
هدف از تک قلو این است
که تنها یکی از آنها وجود داشته باشد.
92
00:05:16,690 –> 00:05:20,910
ممکن است در مورد آن مانند یک شیء پیکربندی جهانی فکر کنید
که قرار است همه چیز به اشتراک بگذارد،
93
00:05:20,910 –> 00:05:23,330
مهم نیست که چند بار سعی کنید
یکی را ایجاد کنید.
94
00:05:23,330 –> 00:05:25,780
شما همیشه باید همان
نمونه را برگردانید.
95
00:05:25,780 –> 00:05:29,400
از آنجایی که شما فقط می توانید یک نمونه
از یک تک نفره داشته باشید،