ما يسبب "غير منضم طريقة __init__() يجب أن تسمى سبيل المثال كما الوسيطة الأولى" من هذا الثعبان رمز ؟
سؤال
لدي هذه الفئة:
from threading import Thread
import time
class Timer(Thread):
def __init__(self, interval, function, *args, **kwargs):
Thread.__init__()
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
self.start()
def run(self):
time.sleep(self.interval)
return self.function(*self.args, **self.kwargs)
و اتصل مع هذا البرنامج النصي:
import timer
def hello():
print \"hello, world
t = timer.Timer(1.0, hello)
t.run()
والحصول على هذا الخطأ وأنا لا يمكن معرفة لماذا: unbound method __init__() must be called with instance as first argument
المحلول
وأنت تفعل:
Thread.__init__()
استخدم:
Thread.__init__(self)
وأو، بدلا من ذلك، استخدام super()
نصائح أخرى
وهذا هو السؤال المتداولة في SO، ولكن الجواب باختصار، هو أن الطريقة التي ندعو منشئ الفائقة الخاص بك مثل:
super(Timer,self).__init__()
والأولى، والسبب يجب استخدام:
Thread.__init__(self)
وبدلا من
Thread.__init__()
ولأن كنت تستخدم اسم الفئة، وليس كائن (مثيل الطبقة)، وبالتالي لا يمكنك استدعاء أسلوب بالطريقة نفسها ككائن.
وثانيا، إذا كنت تستخدم بيثون 3، وأسلوب الموصى بها لالاحتجاج أسلوب فئة السوبر من فئة فرعية هي:
super().method_name(parameters)
وعلى الرغم من أن في بيثون 3 من الممكن استخدام:
SuperClassName.method_name(self, parameters)
ووهو النمط القديم من بناء الجملة التي ليست تفضل النمط.
أنت فقط تحتاج إلى تمرير "الذات" كحجة 'الموضوع.الحرف الأول'.بعد ذلك يعمل على الآلات.