الوصول إلى متغير فئة ثابتة من فئة الأصل في بيثون
-
28-09-2019 - |
سؤال
لدي شيء مثل هذا
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