متد super و __init__ در پایتون


#1

سلام دوستان .
میخواستم اگه زحمت نشه یکم در مورد متد سوپر و اینیت در پایتون برام بگید …

فقط در مورد اینا میدونم که init وقتی شی ساخته میشه به طور اتوماتیک اجرا میشه …(خب سوالم اینه یعنی چی؟ اصن به چه دردی میخوره؟)
:face_with_monocle:
و در مورد ()super اینکه اگه اشتباه نکنم از کلاس پدر هر متدی رو بخوای میتونی کپی کنی و ازش در متد فرزند استفاده کنی؟؟

یکم در مورد این دو تا از مبتدی تا یکم پیشرفته توضیح بدین ممنون میشم …


#2

سلام،
در oop زمانی که یک شیئ از یک کلس درست یا Initialize میشه متدی به نام constructor یا همون initializer که در پایتون init هست, دقیقا در زمان ایجاد آبجکت اجرا میشه که میتونیم در اون متد فیلدهای آبجکت رو مقدار دهی کنیم.
در مثال زیر Duck یک فیلد به نام name و یک instance method به نام say_name داره که جمله ای رو با استفاده از name میسازه و چاپ میکنه. اگر توجه کنید دوتا آبجکت از Duck درست شده که هر کدوم name خودشون رو دارند و name در constructor و دقیقا در زمان instantiation مقداردهی شده.

init مخفف initialize هست.

class Duck(object):
  def __init__(self, name):
    self.name = name
    
  def say_name(self):
    print("My name is {}!".format(self.name))
    
dan = Duck("Dan")
ben = Duck("Ben")

dan.say_name()
ben.say_name()

کارها و عملیات دیگری هم میشه در init انجام داد اما بهتره تا جایی که میتونیم از init فقط برای پر کردن فیلد ها استفاده کنیم که از پیچیدگی کاسته بشه.

Constructor و Initializer هر دو یک مفهوم هستند که در بعضی زبانها میگن constructor و بعضی هم initializer, فرقی با هم ندارند. من از هر دو استفاده میکنم


#3

میتونیم از super در زمان override کردن متدهای اصلی استفاده کنیم، لطفا بگین دقیقا کجای super مفهوم نیست که توضیح بدم. اگر نیاز به مثال دارید هم بفرمایید که مثال بزنم


#4

خیلیم عالی کاملا فهمیدم …
پس : مقداردهی به اعضای داد ای کلاس در بدنه آن، (منظور فیلد )به دو صورت انجام میگیره :

یکی در هنگام تعریف کلاس (اول کلاس) ==> مثل "name = "Dan به صورت ساده و معمولی

و روش دوم توسط Initializer که اونم برای مقدار دهی اولیه به اعضای کلاس صورت میگیره

اینو کامل فهمیدم … ممنون


#5

اقا توماج میشه یه بار این super رو برام کامل توضیح بدین فکر کنم کلا نفهمیدم چه کار انجام میده … اصلا نمیدونم
override کردن متدهای اصلی چیه ؟ مبتدی باشه بهتره … :sweat_smile::purple_heart:


#6

در oop مفهومی با عنوان inheritance وجود داره، وقتی یک class رو از class دیگه ای extend میکنیم با هم رابطه parent-child پیدا میکنند، برای دسترسی به فیلد ها و متدهای parent از super استفاده میکنیم.

در پایتون super آبجکتی است که به عنوان نماینده ابجکت parent عمل میکنه و از طریق super به متدهای parent دسترسی داریم.

در مثال زیر کلاس Anatidae متدی به نام init و متدی به نام say_name داره، dan از Anatidae و ben از Duck ساخته شده. در کلاس Duck متد say_name مسئولیت بیشتری نسبت به همون متد در Anatidae داره و همونطور که میبینید باید علاوه بر اجرای say_name متد talk رو هم اجرا کنه. بجای دوباره نویسی say_name، همین متد رو از super که نماینده Anatidae هست صدا زدیم و بعد متد talk که فقط در نمونه Duck وجود داره.

class Anatidae(object):
  def __init__(self, name):
    self.name = name
    
  def say_name(self):
    print('My name is {}!'.format(self.name))

class Duck(Anatidae):
  def say_name(self):
    super().say_name()
    self.talk()

  def talk(self):
    print('Using Telegram causes extinction of ducks!')		

dan = Anatidae('Dan')
ben = Duck('Ben')

dan.say_name()
ben.say_name()

duck = اردک
extend = گسترش دادن
Anatidae = اردکیان
inheritance = وراثت


#7

اصلاح شد :point_up_2:
اگر توضیح کافی نیست پست بزارید!


#8

دست شما درد نکنه واسه وقتی که گذاشتید کاملا مطلب رسا بود و کاملا فهمیدم مسعله چی هستش :pray:


#9

حالا اگه همون دستور super رو به این شکل بنویسیم کد رو چطور تحلیل می‌کنید؟

super(Anatidae, self).say_name()

#10

متوجه منظورتون از تحلیل کردن نشدم, در ضمن کد بالا با کدوم کد عوض بشه؟


#11

اینجا:

class Duck(Anatidae):
  def say_name(self):
    super(Anatidae, self).say_name()
    self.talk()

#12

میتونید با استفاده از ``` کدها رو خواناتر بزارید.
سوال اصلی من این بود که منظور شما از تحلیل کد چیه؟
یعنی میگید که چرا super در نسخه من آرگمان نداشت؟


#13

لطفا راهنماییم کنید که آرگومان داشته باشه یا نداشته باشه معنیش چه تفاوتی می‌کنه؟ مخصوصا به اینصورت که گذاشتم.
آموزشی که من دیدم همیشه بدون آرگومان بوده. یه جا مسابقه کدنویسی شرکت کردم یه سوال بود به اینصورت که کلا منو به هم ریخت.


#14

میشه لطف کنید سوال رو بدین که درست متوجه بشم و بتونم بهتر جواب بدم؟
چون تنها فرقی که من میدونم اینه که آرگومان type و instance اصلاحا redundant هستند، یعنی نیازی نیست که نوشته بشن. فکر می کنم این بدلیل تفاوت استفاده از super در پایتون ۲ و ۳ هست.


#15

سوال مربوط به پایتون ۳ هست

class A:
    def __init__(self):
        print(1)
class B(A):
    def __init__(self):
        super(A, self).__init__()
        print(2)
obj = B()

پاسخ صحیح در خروجی ۲ هست. جواب من ۱ و بعد ۲ بود.


#16

متوجه نشدم, این اطلاعات کافی نیست :slight_smile:


#17

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