َARIA STR
2 سال پیش توسط َARIA STR مطرح شد
6 پاسخ

نقش self در پایتون بخش کتابخونه ی یونیت تست

یه سوالی ذهنه منو درگیر کرده و بدجوری داره میره رو مخم :))))
آقا سوال کلیم اینه ما توی پایتون وقتی یه کلاسی میسازیم و توش هرچندتا متودی که میسازیم اولین آرگومانی که به اون متودمون میدیم کلمه ی (self) هستش درسته. خب این سلف یعنی اینکه وقتی ما آبجکتی (شی) ای از روی کلاسمون میسازیم و از اون متود هایی که نوشتیم توی کلاسمون برای همین آبجکت هایی که نوشتیم استفاده میکنیم این آبجکت های ما به صورت اتوماتیک میرن جای اون self میشینن.

حالا سواله اصلیه من اینه که توی پایتون ما وقتی میخوایم از UnitTest استفاده کنیم تا مثلا توابعمون رو تست کنیم یا کلا کدمون رو تست کنیم
وقتی از کتابخونه ی unittest.TestCase ارث بری میکنیم و متودی میسازیم طبق معمول آرگومان اول متود هامون رو (self) میدیم اما نکته و سوال اصلیه من اینه که ما توی unittest اصلا آبجکتی نمیسازیم که بخواد بره جای این (self) ها بشینه پس دلیلش چیه که self میدیم؟ یعنی یه آبجکت مربوطه از کتابخونه ی unittest به طور خودکار میاد جای این (self) ها میشینه؟
چندتا نمونه کدم میفرستم تا بهتر منظورمو متوجه شید.

class Game:
def say_hi(self):
print('Hi')

g1 = Game
g1.say_hi()
###The OutPut Is: Hi

اما حالا میخوایم همین متودمون رو با استفاده از کتابخونه ی یونیت تست بررسی و تست کنیم.و اگه دقت کنید من هیچ آبجکتی نمیسازم...

import unittest
import File

class TestFile(unittest.TestCase):
def test_say_hi(self):
self.assertEqual(File.say_hi , 'Hi')

if __name__ == '__main__':
unittest.main()

و خروجی میگه که یه تست رو انجام داده و مشکلی نداشته
حالا ما اینجا هیچ آبجکتی که نساختیم که به صورت اتوماتیک بره جای اون (self) ها بشینه
آیا نظر شما چیست :)))))))
خودم نظرم اینه که یه آبجکت مربوط به این متود assertEqual از کلاس TestCase خود کتابخونه به صورت اتوماتیک میره جای این (self) ها میشینه طبق کدی که برنامه نویسش نوشته....


ثبت پرسش جدید
mmj-sys
تخصص : داش متخصص چیه من پروفسورم .
@mmj.sys 2 سال پیش مطرح شد
0

@aria1996

کی گفته شما ابجکتی نمی سازید ؟
شما وقتی ارث بری میکنی تمامی اون کلاسی که ارث بری کردید میاد تو کلاس خودتون حالا فراخانی رو باید با self انجام بدید . دیگه نمیشه بگید سلف به چه دردی میخوره دارید یک ابجکت بر اساس اون چیزی که ارث بری شده مینویسید با چند تا چیز دیگه درواقع شما یک ابجکت رو کپی کردید .
و سلف هم به همون ابجکت اشاره داره


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 2 سال پیش مطرح شد
0

بهترین راه برای درک کردن چنین مواردی سر زدن به کدهای منبع هست
https://github.com/python/cpython/blob/3.10/Lib/unittest/__init__.py
وقتی کد منبع رو بخونی به عنوان برنامه نویس میفهمی چه اتفاقی داره می افته


َARIA STR
تخصص : برنامه نویس
@aria1996 2 سال پیش مطرح شد
0

آره اینم یه راهشه...


میلاد خسروی
تخصص : برنامه نویس بامزه
@milwad 2 سال پیش مطرح شد
0

سلام خسته نباشید
ببین اینی که میگم کامل نیست چون میشه روش بحث کرد ولی در کل self به کلاس فعلی اشاره میکنه اگه زبون های دیگه هم کار کرده باشی اصولا یه this باید داشته باشه دقیقا self جای this هست


َARIA STR
تخصص : برنامه نویس
@aria1996 2 سال پیش مطرح شد
0

حرفت به صورت کلی درسته
ولی سواله من یه چیز دیگس...


mmj-sys
تخصص : داش متخصص چیه من پروفسورم .
@mmj.sys 2 سال پیش مطرح شد
0

@aria1996

کی گفته شما ابجکتی نمی سازید ؟
شما وقتی ارث بری میکنی تمامی اون کلاسی که ارث بری کردید میاد تو کلاس خودتون حالا فراخانی رو باید با self انجام بدید . دیگه نمیشه بگید سلف به چه دردی میخوره دارید یک ابجکت بر اساس اون چیزی که ارث بری شده مینویسید با چند تا چیز دیگه درواقع شما یک ابجکت رو کپی کردید .
و سلف هم به همون ابجکت اشاره داره


َARIA STR
تخصص : برنامه نویس
@aria1996 2 سال پیش مطرح شد
0

این درست بود.
خودمم نظرم یه همچین چیزی بود درواقع داریم از چیزایی که توی اون کلاسی که ازش ارث بری کردیم استفاده میکنیم.
و آبجکت های موردنظری که از همون کلاس ساخته شده رو هم به صورت خودکار ارث بری میکنیم.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام