راکت
حل شده

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

6 پاسخ

یه سوالی ذهنه منو درگیر کرده و بدجوری داره میره رو مخم :))))
آقا سوال کلیم اینه ما توی پایتون وقتی یه کلاسی میسازیم و توش هرچندتا متودی که میسازیم اولین آرگومانی که به اون متودمون میدیم کلمه ی (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) ها میشینه طبق کدی که برنامه نویسش نوشته....

َARIA STR
َARIA STR
@aria1996
ثبت پرسش جدید

پاسخ‌ها

6
mmj-sys
mmj-sys
@mmj.sys

تخصص: داش متخصص چیه من پروفسورم .

بهترین پاسخ

@aria1996

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

َARIA STR
َARIA STR
@aria1996

تخصص: برنامه نویس

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

شاید پاسخ شما همین‌جا باشد

میلاد خسروی
میلاد خسروی
@milwad

تخصص: برنامه نویس بامزه

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

َARIA STR
َARIA STR
@aria1996

تخصص: برنامه نویس

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

َARIA STR
َARIA STR
@aria1996

تخصص: برنامه نویس

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

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

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