سؤال

أريد إنشاء ملف namedtuple وهو ما يمثل الأعلام الفردية في بتوفيلد قصيرة. أحاول أن أقوم بدراسات الفئة الفرعية حتى أتمكن من إلغاء تعبئة Bitfield قبل إنشاء tuple. ومع ذلك ، فإن محاولتي الحالية لا تعمل:

class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")):
    __slots__ = ()

    def __new__(cls, status):
        super(cls).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128)

الآن ، تجربتي مع super() محدود وتجربتي مع __new__ غير موجود فعليًا ، لذلك لست متأكدًا تمامًا مما يجب ارتكابه للخطأ الغامض (بالنسبة لي) TypeError: super.__new__(Status): Status is not a subtype of super. غوغلينغ والحفر في المستندات لم تسفر عن أي شيء تنوير.

مساعدة؟

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

المحلول

لقد حصلت عليه تقريبًا :-) هناك تصحيحان صغيران فقط:

  1. ال الجديد الطريقة تحتاج إلى إرجاع بيان
  2. ال ممتاز يجب أن يكون للمكالمة حجتين ، CLS و حالة

الرمز الناتج يبدو هكذا:

import collections

class Status(collections.namedtuple("Status", "started checking start_after_check checked error paused queued loaded")):
    __slots__ = ()

    def __new__(cls, status):
        return super(cls, Status).__new__(cls, status & 1, status & 2, status & 4, status & 8, status & 16, status & 32, status & 64, status & 128)

إنه يعمل بشكل نظيف ، تمامًا كما توقعت:

>>> print Status(47)
Status(started=1, checking=2, start_after_check=4, checked=8, error=0, paused=32, queued=0, loaded=0)

نصائح أخرى

كنت أتجنب super ما لم تكن تلبي بشكل صريح لميراث متعدد (نأمل ألا يكون الأمر هنا ؛-). فقط افعل شيئًا مثل ...:

def __new__(cls, status):
    return cls.__bases__[0].__new__(cls,
                                    status & 1, status & 2, status & 4,
                                    status & 8, status & 16, status & 32,
                                    status & 64, status & 128)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top