python - لغة - مكتبة اكواد بايثون




المتغيرات والطرق الخاصة في بيثون (3)

تسطير مزدوج. هذا يحرف الاسم. لا يزال من الممكن الوصول إلى المتغير ، ولكنها فكرة سيئة بشكل عام للقيام بذلك.

استخدم شُرط سفلية فردية لشبه الخاصة (يطالب مطورو python "بتغيير هذا فقط إذا كنت مضطرًا تمامًا") ويتضاعف بشكل خاص تمامًا.

ممكن تكرار:
معنى واحد ، وشرطة سفلية مزدوجة قبل اسم الكائن في بايثون

أي يجب أن أستخدم _foo (تسطير أسفل السطر) أو __bar (تسطير مزدوج) للأعضاء العاديين والأساليب في Python؟


تسطير مزدوج. يتغاضى عن الاسم بطريقة لا يمكن الوصول إليها ببساطة من خلال __fieldName من خارج الفصل ، وهو ما تريد أن تبدأ به إذا كانت خاصة. (على الرغم من أنه لا يزال من الصعب الوصول إلى هذا المجال).

class Foo:
    def __init__(self):
        self.__privateField = 4;
        print self.__privateField # yields 4 no problem

foo = Foo()
foo.__privateField
# AttributeError: Foo instance has no attribute '__privateField'

سيتم الوصول إليه من خلال _Foo__privateField بدلاً من ذلك. لكنه يصرخ "أنا لا أحب" ، وهو أفضل من لا شيء.


يرجى ملاحظة أنه لا يوجد شيء اسمه "طريقة خاصة" في بايثون. الشرط المزدوج هو مجرد اسم مشطوف:

>>> class A(object):
...     def __foo(self):
...         pass
... 
>>> a = A()
>>> A.__dict__.keys()
['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__']
>>> a._A__foo()

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

EDIT ، فيما يتعلق بالارتباك على __ ، PEP-8 واضح تمامًا على ذلك:

إذا كان الغرض من صفك هو أن يكون تحت فئة فرعية ، ولديك سمات لا تريد أن تستعملها الفئات الفرعية ، فكر في تسمية هذه الكلمات باستخدام شرطات سفلية بادئة مزدوجة وبدون شُرَط سفلية زائدة. هذا يستدعي اسم Python لتهذيب الخوارزمية ، حيث يتم تقسيم اسم الفئة إلى اسم السمة. هذا يساعد على تجنب الاصطدامات اسم سمة يجب subclasses دون قصد تحتوي على سمات بنفس الاسم.

ملاحظة 3: ليس كل شخص يحب تشبه الاسم. حاول موازنة الحاجة إلى تجنب الصدامات غير المقصودة مع الاستخدام المحتمل بواسطة المتصلين المتقدمين.

لذلك إذا كنت لا تتوقع من الفئة الفرعية أن تعيد تعريف الطريقة الخاصة بها بنفس الاسم ، فلا تستخدمها.





private-methods