سؤال

في بايثون، أريد الحصول على سمة فئة، قاموس، مع القيم التي تمت تهيئتها.لقد كتبت هذا الرمز:

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}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top