পাইথন সুপার () টাইপ এরির উত্থাপন করে


109

পাইথন 2.5 তে, নিম্নলিখিত কোডগুলি একটি উত্থাপন করে TypeError:

>>> class X:
      def a(self):
        print "a"

>>> class Y(X):
      def a(self):
        super(Y,self).a()
        print "b"

>>> c = Y()
>>> c.a()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in a
TypeError: super() argument 1 must be type, not classobj

আমি যদি এর class Xসাথে প্রতিস্থাপন করি তবে class X(object)এটি কার্যকর হবে। এর ব্যাখ্যা কী?


3
আপনার "তবে আমি দশম শ্রেণীর পরিবর্তে দশম শ্রেণি (অবজেক্ট) দিয়ে" আমার সমস্যাটি স্থির করে! ধন্যবাদ
AliBZ

উত্তর:


132

কারণটি হ'ল কেবল নতুন স্টাইলের ক্লাসগুলিতেsuper() পরিচালিত হয় , যার 2.x সিরিজের অর্থ এর থেকে বাড়ানো :object

>>> class X(object):
        def a(self):
            print 'a'

>>> class Y(X):
        def a(self):
            super(Y, self).a()
            print 'b'

>>> c = Y()
>>> c.a()
a
b

4
অজগর সংস্করণটি থেকে এটি ডিফল্ট আচরণে পরিণত হয়েছিল?
জিও

6
২.২ ছিল যখন নতুন-স্টাইলের ক্লাস চালু হয়েছিল, 3.0 যেখানে সেগুলি ডিফল্ট হয়েছিল।
কোডি ব্রোসিওস

7
@ সুনামি যদি আপনি সুপার ক্লাসে উঠতে চান তবে "Xa (স্ব)" করুন
জেমস ব্র্যাডি

আমার মনে হয় আপনি আমাকে ভুল বুঝেছেন। ট্রিপটিচ আমার মনে আছে আমি 3.0 এর চেয়েও কম পাইথন সংস্করণ ব্যবহার করছিলাম এবং আমি স্পষ্টভাবে বলিনি যে আমার ক্লাসটি অবজেক্টের কাছ থেকে উত্তরাধিকার সূত্রে এসেছে, এবং কলটি সুপার ওয়ার্ক করেছে। হতে পারে এটি ২.6 থেকে ডিফল্ট আচরণ? শুধু বলছি :)
জিও

আলাবাস্টার, আসলে এর দরকার নেই। নতুন স্টাইলের ক্লাসগুলিতে কেবল দুর্দান্ত নয়, প্রচুর সুবিধা রয়েছে। পুরানো শৈলীর উপায়গুলি প্রচার করা উচিত নয়।
কোডি ব্রোসিয়াস

14

অতিরিক্ত হিসাবে, সুপার () না ব্যবহার করা উচিত। আপনার সন্দেহ হতে পারে এমন নতুন স্টাইলের ক্লাসগুলি করা সাধারণ-উদ্দেশ্য "সঠিক জিনিস" নয়।

এমন এক সময় রয়েছে যখন আপনি একাধিক উত্তরাধিকারের প্রত্যাশা করছেন এবং আপনি সম্ভবত এটি চাইতে পারেন, তবে যতক্ষণ না আপনি এমআরওয়ের লোমশ বিবরণটি জানেন না, সর্বোপরি এটিকে একা ছেড়ে চলে যান:

 X.a(self)

2
এটি কি সঠিক কারণ আমার 6 মাসের পাইথন / জ্যাঙ্গোতে আমি সুপারটিকে "সাধারণ সঠিক জিনিস" হিসাবে ব্যবহার করছি?
ফিলোগো 20

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

3

যদি উপরের উত্তরগুলির মধ্যে কোনও উত্তরই পরিষ্কারভাবে উল্লেখ করে না। আপনার অভিভাবক শ্রেণীর "অবজেক্ট" থেকে উত্তরাধিকার সূত্রে হওয়া দরকার, যা মূলত এটিকে নতুন শৈলীর শ্রেণিতে পরিণত করবে।

# python 3.x:
class ClassName(object): # This is a new style class
    pass

class ClassName: # This is also a new style class ( implicit inheritance from object )
    pass

# Python 2.x:
class ClassName(object): # This is a new style class
    pass

class ClassName:         # This is a old style class
    pass

দুঃখিত, তবে পাইথন 3..x এ আপনার দ্বিতীয় উদাহরণ (অন্তর্নিহিত উত্তরাধিকার) উল্লিখিত সমস্যাটির প্রসঙ্গে সত্যই কাজ করে না।
সোফ্রস

1

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

আমার নির্দিষ্ট অ্যাপ্লিকেশনটি পাইথনের সেন্টিমিডি.সিএমডি মডিউল ছিল যা সম্ভবত কোনও কারণে নিউস্টাইল অবজেক্ট নয়।

সর্বশেষ ফলাফল:

X().a(self)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.