পাইথনের উত্তরাধিকার: প্রকারের ত্রুটি: অবজেক্ট .__ init __ () কোনও পরামিতি নেয় না


90

আমি এই ত্রুটি পেয়েছি:

TypeError: object.__init__() takes no parameters 

আমার কোড চালানোর সময়, আমি এখানে আসলে কী ভুল করছি তা আমি সত্যিই দেখতে পাই না:

class IRCReplyModule(object):

    activated=True
    moduleHandlerResultList=None
    moduleHandlerCommandlist=None
    modulename=""

    def __init__(self,modulename):
        self.modulename = modulename


class SimpleHelloWorld(IRCReplyModule):

     def __init__(self):
            super(IRCReplyModule,self).__init__('hello world')

উত্তর:


115

আপনি আপনার সুপার () কলটিতে ভুল শ্রেণীর নাম কল করছেন:

class SimpleHelloWorld(IRCReplyModule):

     def __init__(self):
            #super(IRCReplyModule,self).__init__('hello world')
            super(SimpleHelloWorld,self).__init__('hello world')

মূলত আপনি যা সমাধান করছেন তা হ'ল __init__অবজেক্ট বেস শ্রেণীর যা কোনও প্যারাম নেয় না।

আমি জানি যে, আপনি ইতিমধ্যে যে শ্রেণীর ভিতরে রয়েছেন তা নির্দিষ্ট করতে হবে, এজন্য পাইথন 3-এ আপনি কেবল এটি করতে পারেন: super().__init__()


4
@ লুকাসকফম্যান: আসলে আমি এটিকে খুব মূর্খ মনে করি না। এটি সহজেই একটি বিভ্রান্তিকর ধারণা হতে পারে। আমি তোমাকে দোষ দিচ্ছি না
jdi

4
বহু পাইথনিয়ানদের আপত্তিজনক ঝুঁকিতে: এটি - ইমো - ভয়ঙ্কর ভাষার নকশা। আপনার সাহায্যের জন্য ধন্যবাদ @ jdi!
জোহানেস ফারেনক্রুগ

4
@JohannesFahrenkrug - আমি মনে করি না আপনি, যে কেউ ক্ষুব্ধ হওয়ার মতো কারণ যে একটি খারাপ নকশা হিসেবে চিহ্নিত করা হয় এবং python3 সংশোধন না: docs.python.org/3/library/functions.html#super
jdi

3

এটি সম্প্রতি আমাকে দু'বার কামড় দিয়েছে (আমি জানি আমার ভুল থেকে প্রথমবারের মতো শিখতে হবে) এবং গ্রহণযোগ্য উত্তরটি আমাকে এতটা সময় দেয়নি যখন আমার মনে তাজা থাকাকালীন আমি ভেবেছিলাম আমি ঠিক নিজের ক্ষেত্রে নিজের উত্তর জমা দেব অন্য কারও মধ্যে এটি চলছে (বা ভবিষ্যতে আমার এটি আবার দরকার)।

আমার ক্ষেত্রে বিষয়টি হ'ল আমি সাবক্লাসের সূচনাতে কোনও কাওয়ার্গ পাস করছিলাম তবে সুপারক্লাসে যে কীওয়ার্ড আরগটি তখন সুপার () কলের মধ্যে পাস করা হয়েছিল।

আমি সবসময় মনে করি যে এই ধরণের জিনিস একটি উদাহরণ দিয়ে সবচেয়ে ভাল:

class Foo(object):
  def __init__(self, required_param_1, *args, **kwargs):
    super(Foo, self).__init__(*args, **kwargs)
    self.required_param = required_param_1
    self.some_named_optional_param = kwargs.pop('named_optional_param', None)

  def some_other_method(self):
    raise NotImplementedException

class Bar(Foo):
  def some_other_method(self):
    print('Do some magic')


Bar(42) # no error
Bar(42, named_optional_param={'xyz': 123}) # raises TypeError: object.__init__() takes no parameters

সুতরাং এটি সমাধান করার জন্য আমাকে কেবল Foo .__ init__ পদ্ধতিতে যে জিনিসগুলি করা হয় তার ক্রমটি পরিবর্তন করতে হবে; যেমন:

class Foo(object):
  def __init__(self, required_param_1, *args, **kwargs):
    self.some_named_optional_param = kwargs.pop('named_optional_param', None)
    # call super only AFTER poping the kwargs
    super(Foo, self).__init__(*args, **kwargs)
    self.required_param = required_param_1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.