سؤال

لدي شيء مثل هذا

class A:
  __a = 0
  def __init__(self):
    A.__a = A.__a + 1
  def a(self):
    return A.__a

class B(A):
  def __init__(self):
    # how can I access / modify A.__a here?
    A.__a = A.__a + 1 # does not work
  def a(self):
    return A.__a

هل يمكنني الوصول إلى __a متغير فئة في B؟ من المحتمل الكتابة a بدلاً من __a, ، هل هذه هي الطريقة الوحيدة؟ (أعتقد أن الإجابة قد تكون قصيرة إلى حد ما: نعم :)

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

المحلول

لذا، __a ليس أ ثابتة متغير ، إنه متغير فئة. وبسبب الرائدة المزدوجة ، فهو أ الاسم مشوهة عامل. وهذا هو ، لجعلها زائفة خاصة ، تم إعادة تسميتها تلقائيًا _<classname>__<variablename> بدلاً من __<variablename>. لا يزال من الممكن الوصول إليه بواسطة مثيلات تلك الفئة فقط كما __<variablename>, ، فئات فرعية لا تحصل على هذا المعاملة الخاصة.

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

نصائح أخرى

الرجوع إليها باسم A._A__a. في بيثون ، رموز مع أ __ البادئة التي تحدث داخل تعريف الفئة مسبقة مع _<class-name> لجعلها إلى حد ما "خاص". وبالتالي المرجع A.__a يظهر في تعريف B هو ، على نحو مضاد ، إشارة إلى A._B__a:

>>> class Foo(object): _Bar__a = 42
... 
>>> class Bar(object): a = Foo.__a
... 
>>> Bar.a
42

هناك ديكور بيثون @staticmethod و @classmethod, ، والتي يمكنك استخدامها لإعلان طريقة ثابتة أو متعلقة بالصف. يجب أن يساعد هذا في الوصول إلى عنصر بيانات الفصل الخاص بك:

class MyClass:
     __a = 0

     @staticmethod
     def getA():
         return MyClass.__a

class MyOtherClass:

     def DoSomething(self):
         print MyClass.getA() + 1

مثال مستوحى من هذا المصدر:http://www.rexx.com/~dkuhlman/python_101/python_101.html

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