فشل Super () مع الخطأ: TypeError "وسيطة يجب أن تكون النوعية، وليس classobj" عندما لا يرث الأصل من الكائن

StackOverflow https://stackoverflow.com/questions/1713038

سؤال

أحصل على بعض الخطأ الذي لا يمكنني معرفة ذلك. أي دليل ما هو الخطأ في نموذجي عينة؟

class B:
    def meth(self, arg):
        print arg

class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)

حصلت على نموذج اختبار العينة من مساعدة الطريقة المدمجة "Super". الطبقة "C" هي

هنا هو الخطأ:

Traceback (most recent call last):
  File "./test.py", line 10, in ?
    print C().meth(1)
  File "./test.py", line 8, in meth
    super(C, self).meth(arg)
TypeError: super() argument 1 must be type, not classobj

FYI، إليك المساعدة (سوبر) من بيثون نفسها:

Help on class super in module __builtin__:

class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:
 |  class C(B):
 |      def meth(self, arg):
 |          super(C, self).meth(arg)
 |
هل كانت مفيدة؟

المحلول

مشكلتك هي أن الفئة B لا يتم الإعلان عن فئة "النمط الجديد". تغييره مثل ذلك:

class B(object):

وسيعمل.

super() وجميع الأشياء الفئة الفرعية / superclass تعمل فقط مع فصول النمط الجديد. أوصي أنك تحصل على عادة الكتابة دائما (object) على أي تعريف فئة للتأكد من أنه فئة نمط جديد.

الفصول النمط القديمة (المعروفة أيضا باسم الفصول الكلاسيكية ") هي دائما من النوع classobj; ؛ فصول النمط الجديد من النوع type. وبعد هذا هو السبب في أنك حصلت على رسالة الخطأ التي رأيتها:

TypeError: super() argument 1 must be type, not classobj

جرب هذا لنرى بنفسك:

class OldStyle:
    pass

class NewStyle(object):
    pass

print type(OldStyle)  # prints: <type 'classobj'>

print type(NewStyle) # prints <type 'type'>

لاحظ أنه في Python 3.x، جميع الفصول هي نمط جديد. لا يزال بإمكانك استخدام بناء الجملة من الفئات النمط القديم ولكن تحصل على فئة نمط جديد. لذلك، في Python 3.x لن تواجه هذه المشكلة.

نصائح أخرى

أيضا، إذا لم تتمكن من تغيير الفئة B، فيمكنك إصلاح الخطأ باستخدام الميراث المتعدد.

class B:
    def meth(self, arg):
        print arg

class C(B, object):
    def meth(self, arg):
        super(C, self).meth(arg)

print C().meth(1)

إذا كان إصدار بيثون هو 3.x، فلا بأس بذلك.

أعتقد أن إصدار Python الخاص بك هو 2.x، سيعمل السوبر عند إضافة هذا الرمز

__metaclass__ = type

لذلك الرمز هو

__metaclass__ = type
class B:
    def meth(self, arg):
        print arg
class C(B):
    def meth(self, arg):
        super(C, self).meth(arg)
print C().meth(1)

كنت تواجه أيضا القضية المنشورة عندما استخدمت بيثون 2.7. انها تعمل بشكل جيد للغاية مع بيثون 3.4

لجعلها تعمل في بيثون 2.7 لقد أضافت __metaclass__ = type السمة في الجزء العلوي من برنامجي وعملت.

__metaclass__ : إنه يخفف الانتقال من الفصول النمط القديم ودروس النمط الجديد.

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