[TehPUG] about " self " ...

Peyman Karimi peykar at gmail.com
Fri Jun 19 08:28:11 CEST 2015


سلام،
فکر می‌کنم دلیل اینکه با فهم چیستی self مشکل دارید، اینه که با انواع متدها
در پایتون آشنایی ندارید. در پایتون، سه نوع متد وجود داره.متد آبجکت یا
object method، متد کلاس یا class method،  و متد ایستا یا static method که
هر سه این‌ها درون کلاس تعریف می‌شن اما کاربرد و رسالت متفاوتی دارند. من شرح
رسالت هر کدوم رو خیلی ساده و مختصر می‌گم، که البته نیازمند این هست که با
معانی فنی کلماتی مثل «نمونه» و «کلاس»‌ آشنا باشید و بین این کلمات بتونید
تمیز بدید.

۱. متد آبجکت: همونی هست که شما درباره اون سوال داری و اولین پارامتری که بهش
ارسال میشه «شیء» یا همون «نمونه»ای ایجاد شده از کلاس هست. برطبق «عرف» (هرجا
کانونشن: convention در علوم رایانه دیدی، یعنی بهتره رعایتش کنی، اما مجبور
نیستی) اسمش self هست. وقتی ما نیاز داریم درون متدی که می‌نویسیم از داده‌های
مربوط به شیء استفاده کنه، از این نوع متد استفاده می‌کنیم. مثل همون مثالی که
آقای خشنودی زدن و از مقدارِ property نام فرد استفاده کردن که مختصِ اون
نمونه‌ی خاص هست.

۲. متد کلاس: اگر بخواهیم یک عملکرد برای کلاسمون تعریف کنیم که نیازی به
داده‌های یک نمونه خاص از اون کلاس نداره، اما به داده‌های تعریف شده در خود
کلاس نیاز داره، از کلاس متد استفاده می‌کنیم. در این مواقع بصورت «عرف» از
لفظ cls برای فرستادن کلاس به درون متد استفاده می‌شه، یعنی تعریفی که داریم
چیزی شبیه به این هست هست:
class A(object):
    FOO = 'foo'
    @classmethod
    def a_class_method(cls, bar):
         print cls.FOO
         ...

۳. نوع سوم هم استتیک متد یا متد ایستا هست. در این مواقع در حقیقت ما یک تابع
داریم، که فقط چون وابسته به یک کلاس خاص هستد و با کاری رو در رابطه با اون
انجام می‌ده، اما هیچ‌نیازی به داده‌های کلاس یا آبجکت نداره، بهش متد استاتیک
می‌گن. تنها فرقش با تابع معمولی اینه که درون کلاس تعریف شده. چیزی شبیه به
این:
class A(object):
    @staticmethod
    def a_class_method(foor, bar):
         print "Hi!"
         ...

امیدوارم کمکی کرده باشم.






2015-06-18 12:05 GMT+04:30 Vahid Maani <vahidmaani at gmail.com>:

>  مهدی خوب توضیح داد چندتا نکته رو هم اضافه کنم، self اسم اولین آرگومان
> متد‌ها هست و هیچ لزومی نداره حتماً از این اسم استفاده کنی ولی استفاده از
> self یه قانون نانوشته‌ی خیلی قوی هست که خوانایی کدت بالا بره یعنی می‌تونی
> از کلمات this و هر اسم دلخواه استفاده کنی.
>
> دوّم اینکه این self به خود ابجکت/نمونه اشاره داره.
>
> (چیز‌های زیادی نوشتم ولی به نظرم اومد که با نوشتن نمی‌شه کامل و شفاف توضیح
> داد و احتمال اینکه گیج‌ترت کنه هست. به نظرم توی این مورد هم طرح منتور‌شیپ
> مهدی بهتر جواب می‌ده :) )
>
>
> On 06/18/2015 03:33 AM, Mehdy Khoshnoody wrote:
>
>  سلام
>
>  شما فرض کن یه کلاس داری به اسم User:
>
>  class User(object):
>     def __init__(self, name):
>         self.name = name
>     def say_hi(self):
>         print("hey, {}!!".format(self.name))
>
>  خوب شما الان می‌تونی از این کلاس نمونه بسازی.
> first_user = User(name="Abbas")
> اتفاقی که تو کد بالا میوفته اینه که متد __init__ کلاس یوزر صدا زده میشه و
> آرگومان‌هاش name="abbas" و self=first_user هست.
> توی متد ما خاصیت name رو به self(first_user) اضافه کردیم و اونو برابر با
> مقدار name قرار دادیم.
>
>  در نتیجه شما الان first_user تون یه خاصیت به اسم name داره که می‌تونید
> ازش استفاده کنید.
> print("hello, {}".format(first_user.name))
> حالا شما فرض کن تو کلاس User یه متد بنویسی که همه‌ی نمونه‌هایی که از این
> کلاس ساخته می‌شن این متد رو داشته باشن.
> مثلا متد say_hello! می‌خوایم وقتی متد رو صدا زدیم به یوزر سلام کنه. خوب ما
> که نمی‌دونیم الان کدوم نمونه از User این متد رو صدا زده (first_user,
> second_user ,...). در نتیجه اینجا مفهوم self کاملا ملموسه! بهش می‌گیم مهم
> نیست کدوم نمونه بود، همه‌ی نمونه‌ها name دارند. تو از name خوده(self) نمونه
> استفاده کن.
> وقتی کد زیر اجرا میشه
> first_user.say_hi()
> در واقع این اتفاق میوفته
> User.say_hi(self=first_user)
> پس وقتی این متد اجرا میشه self، که خود نمونه‌ی فعلی باشه برابر با
> first_user هست و مقدار همه‌ی خواصی که در متد استفاده شده مربوط به
> first_user خواهد بود.
>
>  و در یه جمله «self هرجای کلاس برابر نمونه‌ی فعلی است»
>
>  On Thu, Jun 18, 2015 at 1:21 AM Abbas Aghasy <hlmaz8080 at gmail.com> wrote:
>
>>  سلام به همه ی دوستان !
>> میشه به من بگید کار self چیه ؟! کسی میتونه به طور کلی توضیح بده ؟! ممنون
>> میشم اگه طوری بگید که من هم متوجه بشم چون من 3 ماهه که با پایتون کار میکنم
>> ! خسته نباشد ! برای توضیح بیشتر این ویدیو رو هم نگاه کنید !
>>  _______________________________________________
>> TehPUG mailing list
>> Website: http://tehpug.ir
>> List Address" TehPUG at python.org
>> List Options: https://mail.python.org/mailman/listinfo/tehpug
>
>
>
> _______________________________________________
> TehPUG mailing list
> Website: http://tehpug.ir
> List Address" TehPUG at python.org
> List Options: https://mail.python.org/mailman/listinfo/tehpug
>
>
> --
> وحید معانی
> Vahid MaaniVahid.Maani at gmail.comVahid.Maani@protonmail.comhttp://www.gnutips.ir | https://github.com/vahit
>
>
> _______________________________________________
> TehPUG mailing list
> Website: http://tehpug.ir
> List Address" TehPUG at python.org
> List Options: https://mail.python.org/mailman/listinfo/tehpug
>



-- 
Peyman Karimi
Cell: +98 912 367 6406
↪ http://about.me/peyman.karimi

Listen to the mustn'ts, child. Listen to the don'ts.
Listen to the shouldn'ts, the impossibles, the won'ts.
Listen to the never haves, then listen close to me...
Anything can happen, child. Anything can be...
- Shel Silverstein
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tehpug/attachments/20150619/c9baa341/attachment.html>


More information about the TehPUG mailing list