Python - الرجوع إلى اسم الفصل من داخل نص الفصل
-
27-09-2020 - |
سؤال
في بايثون، أريد الحصول على سمة فئة، قاموس، مع القيم التي تمت تهيئتها.لقد كتبت هذا الرمز:
class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY,
'#':MetaDataElement.MD_TAG}
ولكن عندما أحاول تشغيل هذا الكود، تظهر لي رسالة خطأ "NameError:لم يتم تعريف الاسم "MetaDataElement".هل يمكنك مساعدتي؟
شكرا لك مقدما.
المحلول
لا يمكنك الرجوع إليها MetaDataElement
بينما يتم بناؤه، لأنه لم يكن موجودا بعد.هكذا،
class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY,
'#':MetaDataElement.MD_TAG}
فشل لأن بناء ذاته mapInitiator2Type
يتطلب MetaDataElement
أن يكون له سمات، وهو ليس لديه بعد.يمكنك التفكير في الثوابت الخاصة بك MD_INVALID
, ، إلخ.كمتغيرات محلية لبناء صفك.ولهذا السبب الأعمال التالية، كما كتب icktoofay:
class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!': MD_CATEGORY, # MD_CATEGORY is like a local variable!
'#': MD_TAG}
ومع ذلك، يمكنك الرجوع إلى الفصل MetaDataElement
في أي جزء من التعليمات البرمجية غير المفسرة بعد، كما في
def method_of_MetaDataElement(self):
print MetaDataElement.MD_TAG
حتى انت يملك للإشارة إلى MetaDataElement
, ، هنا، لأن MD_TAG
ليس نوعًا من المتغير المحلي عندما method_of_MetaDataElement()
يتم تنفيذ (MD_TAG
تم تعريفه فقط كنوع من المتغير المحلي أثناء إنشاء الفصل).مرة واحدة في الصف MetaDataElement
أنشئ، MD_TAG
هي ببساطة سمة فئة، وهذا هو السبب method_of_MetaDataElement()
يجب أن أشير إليها على هذا النحو.
نصائح أخرى
أولًا، أنت تستخدم فصول الطراز القديم.ربما ينبغي عليك استخدام فئات النمط الجديد، مثل ذلك:
class MetaDataElement(object):
...
لاحظ ال (object)
.على أية حال، على الرغم من ذلك، ما عليك سوى إزالة MetaDataElement.
عند الإشارة إلى سمات الطبقة.وهذا ما سيبدو عليه الأمر عند الانتهاء من ذلك:
class MetaDataElement(object):
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!': MD_CATEGORY,
'#': MD_TAG}