ما معنى تعبيرات "الذات" و "__init__" في بيثون؟ [مغلق

StackOverflow https://stackoverflow.com/questions/1769774

  •  21-09-2019
  •  | 
  •  

سؤال

لا أفهم ما الذي تستخدمه هذه ، وخاصة self جدال؟ هل يمكن للبعض أن يشرح هذا لي ولماذا تريد أن تمر عبر هذا؟

أيضا ، لقد فكرت دائما __init__ كان من أجل "التهيئة" ، لكن لم يحدث لي أنني لم أضطر أبدًا إلى وضع أي شيء هنا من قبل. هل يمكن لأي شخص أن يعطيني مثالاً سهلاً؟

تحرير: أنا فقط أشعر بالارتباك في كل مرة أراها self يتم تمريرها إلى وظيفة ، أو شيء من هذا القبيل.

هل كانت مفيدة؟

المحلول

self هو الكائن الذي تسميه الطريقة. انها قليلا مثل this في جافا.

__init__ يتم استدعاؤه على كل كائن عند إنشاؤه لتهيئته. إنه مثل المنشئ في جافا.

لذلك سوف تستخدم __init__ كلما أردت تعيين أي سمات - متغيرات الأعضاء في جافا - للكائن عند إنشائها. إذا كنت راضيًا عن كائن "فارغ" ، فلن تحتاج إلى __init__ الطريقة ولكن إذا كنت ترغب في إنشاء كائن مع وسيطات ، فستحتاج إلى واحدة.

مثال على ذلك:

class StackOverflowUser:
    def __init__(self, name, userid, rep): 
        self.name = name
        self.userid = userid
        self.rep = rep

dave = StackOverflowUser("Dave Webb",3171,500)

يمكننا بعد ذلك إلقاء نظرة على الكائن الذي أنشأناه:

>>> dave.rep
500
>>> dave.name
'Dave Webb'

لذلك يمكننا أن نرى __init__ تم تمرير الحجج التي قدمناها للمُنشئ مع self, ، وهو الإشارة إلى الكائن الذي تم إنشاؤه. ثم نستخدم self عندما نقوم بمعالجة الوسائط وتحديث الكائن بشكل مناسب.

هناك مسألة سبب وجود بيثون self عندما لا تحتاج لغات أخرى. بحسب ال بايثون أسئلة وأجوبة:

لماذا يجب استخدام "الذات" صراحة في تعريفات الطريقة والمكالمات؟

أولاً ، من الواضح أنك تستخدم سمة طريقة أو مثيل بدلاً من متغير محلي ...

ثانياً ، فهذا يعني أنه لا يوجد بناء جملة خاص ضروري إذا كنت ترغب في الإشارة صراحة أو الاتصال بالطريقة من فئة معينة ...

أخيرًا ، على سبيل المثال متغيرات ، يحل مشكلة نحوية مع المهمة: نظرًا لأن المتغيرات المحلية في الثعبان هي (بحكم التعريف!) تلك المتغيرات التي يتم تعيين قيمة في هيئة الوظائف (والتي لم يتم الإعلان عنها صراحة) ، يجب أن تكون بطريقة ما لإخبار المترجم أن المهمة كان من المفترض أن تخصص لمتغير مثيل بدلاً من متغير محلي ، ويفضل أن يكون بناءً على النحيل (لأسباب الكفاءة) ...

نصائح أخرى

الذات هي عن طريق الاتفاقية مثيل الكائن الذي تسميه طريقة.

فمثلا:

class MyClass:
  """A simple example class"""
  def __init__(self):
    print "MyClass class created"
  i = 12345
  def f(self):
    return self.i

# Create an object called a of type MyClass. This will print "MyClass class created"
a = MyClass()

# Run the method - should return 12345
print a.f()

# Make another instance of the class to illustrate they are separate.
b = MyClass()
# Set a.i to another value.
a.i = 1

# Note the result
print a.f()
print b.f()

بالمناسبة ، ليس عليك أن تسميها بنفسك ، يمكنك تسميتها ما تريد. ستكون دائما المعلمة الأولى.

فكر في الأمر كمعلمة "هذا" في C ++ / Java: يتم استخدامه للإشارة إلى مثيل للفئة.

Class Whatever:   
  def __init__(self, some_parameter):   
    self.instance_parameter = some_parameter

افكر في __init__ كمثال الفصل البناء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top