سؤال

لنفترض أن لدى فئة مع بعض الصفات.كيف هو الأفضل (في Pythonic OOP) بمعنى أن الوصول إلى هذه السمات ؟ تماما مثل obj.attr ?أو ربما كتابة الحصول على accessors ?ما هي قبول تسمية أنماط مثل هذه الأمور ؟

تحرير: يمكنك وضع على أفضل الممارسات تسمية الصفات مع واحد أو مزدوج الرائدة تؤكد ?أرى في معظم وحدات واحدة تؤكد يستخدم.


إذا كان هذا السؤال قد تم بالفعل طلب (و لدي حدس لديها ، على الرغم من البحث لم يحقق النتائج) ، يرجى الإشارة إلى ذلك - وأنا سوف يغلق هذا واحد.

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

المحلول

المقبولة عموما بعض فقط باستخدام سمات بسيطة مثل

>>> class MyClass:
...     myAttribute = 0
... 
>>> c = MyClass()
>>> c.myAttribute 
0
>>> c.myAttribute = 1
>>> c.myAttribute
1

إذا كنت لا تجد نفسك بحاجة إلى أن تكون قادرة على كتابة حاصل على واضعي ثم ماذا تريد أن تبحث عنه هو "الثعبان خصائص الطبقة" ، ريان Tomayko المادة على حاصل/واضعي/Fuxors هو مكان عظيم للبدء (وإن كان قليلا طويلة)

نصائح أخرى

فيما يتعلق مفردة ومزدوجة-الرائد يؤكد:على حد سواء تشير إلى نفس مفهوم 'خصوصية'.وهذا هو القول, الناس سوف تعرف السمة (سواء كان وسيلة أو "طبيعية" البيانات السمة أو أي شيء آخر) ليست جزءا من API العامة من وجوه.الناس سوف تعرف أن لمسها مباشرة إلى دعوة الكوارث.

على أعلى من ذلك ، انقر نقرا مزدوجا الرائدة في إبراز سمات (ولكن ليس واحد الرائدة في إبراز سمات) هي اسم المهترئ لجعل الوصول إليها عن طريق الصدفة من الفئات الفرعية أو في أي مكان آخر خارج الفصل الحالي أقل احتمالا.لا يزال بإمكانك الوصول إليها ، ولكن ليس بشكل مسلي.على سبيل المثال:

>>> class ClassA:
...     def __init__(self):
...         self._single = "Single"
...         self.__double = "Double"
...     def getSingle(self):
...         return self._single
...     def getDouble(self):
...         return self.__double
... 
>>> class ClassB(ClassA):
...     def getSingle_B(self):
...         return self._single
...     def getDouble_B(self):
...         return self.__double
... 
>>> a = ClassA()
>>> b = ClassB()

يمكنك الآن الوصول بشكل مسلي a._single و b._single والحصول على _single السمة التي أنشأتها ClassA:

>>> a._single, b._single
('Single', 'Single')
>>> a.getSingle(), b.getSingle(), b.getSingle_B()
('Single', 'Single', 'Single')

ولكن محاولة الوصول إلى __double السمة على a أو b سبيل المثال مباشرة لن ينجح:

>>> a.__double
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ClassA instance has no attribute '__double'
>>> b.__double
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ClassB instance has no attribute '__double'

وعلى الرغم من أساليب محددة في ClassA يمكن الحصول على ذلك مباشرة (عندما دعا إما على سبيل المثال):

>>> a.getDouble(), b.getDouble()
('Double', 'Double')

أساليب محددة على ClassB لا يمكن:

>>> b.getDouble_B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in getDouble_B
AttributeError: ClassB instance has no attribute '_ClassB__double'

و في هذا الخطأ يمكنك الحصول على لمحة حول ما يحدث.على __double اسم السمة عند الوصول إلى داخل الصف ، ويجري اسم المهترئ إدراج اسم الفئة التي يتم الوصول إليها في.عندما ClassA يحاول الوصول إلى self.__double, في الواقع يتحول-في compiletime -- في الوصول self._ClassA__double, ، وكذلك ClassB.(إذا كان الأسلوب في ClassB تم تعيين __double, غير المدرجة في قانون الإيجاز ، فإنه لذلك لا تلمس ClassA's __double ولكن إنشاء سمة جديدة.) لا يوجد أي حماية أخرى من هذه السمة ، لذلك لا يزال بإمكانك الوصول إليه مباشرة إذا كنت تعرف الاسم الصحيح:

>>> a._ClassA__double, b._ClassA__double
('Double', 'Double')

ذلك هو السبب في هذه المشكلة ؟

حسنا, انها مشكلة في أي وقت تريد أن ترث وتغيير السلوك من أي رمز التعامل مع هذه السمة.لديك إما أن reimplement كل ما يمس هذا مزدوج-إبراز سمة مباشرة ، أو لديك لتخمين في اسم الفئة و فسد اسم يدويا.فإن المشكلة تزداد سوءا عندما يكون هذا مزدوج-إبراز سمة هو في الواقع الطريقة:تجاوز الأسلوب أو استدعاء الأسلوب في فئة فرعية يعني القيام الاسم-تغيير اسم يدويا ، أو reimplementing كل رمز المكالمات طريقة استخدام مزدوج-التأكيد اسم.ناهيك عن الوصول إلى السمة حيوي ، getattr():سيكون لديك يدويا فسد هناك أيضا.

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

لذلك ، إذا يمكنك استخدام مزدوج-تبرز أسماء استخدامها للغاية لماما ، كما أنها يمكن أن تتحول تماما غير مريح أبدا استخدامها أساليب أو أي شيء آخر فئة فرعية قد تريد من أي وقت مضى reimplement تجاوز أو الوصول مباشرة.و ندرك أن ضعف الرائدة في تسطير اسم-تغيير اسم ويقدم أي حماية حقيقية.في النهاية باستخدام واحد مما يؤدي تسطير انتصارات فقط بقدر ويعطيك أقل (المحتملة في المستقبل) الألم.استخدام واحد الرائدة التأكيد.

تحرير:يمكنك وضع على أفضل الممارسات تسمية الصفات مع واحد أو مزدوج الرائدة تؤكد ?أرى في معظم وحدات واحدة تؤكد يستخدم.

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

مزدوجة البائعين الرائدة زائدة تؤكد يدل وظيفة خاصة ، مثل __add__ وهو ما يسمى عند استخدام مشغل+.

اقرأ المزيد في بيب 8, وخصوصا "اصطلاحات" المقطع.

أعتقد أكثر من مجرد الوصول إليها مباشرة, ما من حاجة عن طرق الحصول على/مجموعة.

>>> class myclass:
...     x = 'hello'
...
>>>
>>> class_inst = myclass()
>>> class_inst.x
'hello'
>>> class_inst.x = 'world'
>>> class_inst.x
'world'

راجع للشغل, يمكنك استخدام الدالة dir() لمعرفة ما سمات/طرق تعلق على سبيل المثال:

>>> dir(class_inst)
['__doc__', '__module__', 'x']

اثنين من أبرز underbars, "__" تستخدم لجعل سمة أو وظيفة خاصة.عن اتفاقيات أخرى تشير إلى بيب 08:http://www.python.org/dev/peps/pep-0008/

الثعبان لا تحتاج إلى تعريف accessors الحق من البداية ، منذ تحويل الصفات في خصائص سريع وغير مؤلم.انظر ما يلي مثال حي:

التعافي من الإدمان

لا يوجد أي نقطة من القيام جالبة/المحددات في بيثون ، لا يمكنك حماية الأشياء على أية حال ، إذا كنت تحتاج إلى تنفيذ بعض رمز إضافية عند الحصول على/إعداد الخاصية تبدو في مكان الإقامة() مدمج (الثعبان -c 'مساعدة(الملكية)')

بعض الناس استخدام حاصل على واضعي.اعتمادا على أسلوب الترميز يمكنك استخدام يمكنك تسميتها getSpam و seteggs.ولكن يمكنك أيضا جعل لكم سمات للقراءة فقط أو تعيين فقط.هذا محرجا بعض الشيء القيام به.طريقة واحدة هي تجاوز

> __getattr__

و

> __setattr__

الأساليب.

تحرير:

في حين جوابي هو لا يزال صحيحا, هذا ليس صحيح, كما جئت لندرك.هناك طرق أفضل لجعل accessors في بيثون و لا حرج للغاية.

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