super()
ডিআরওয়াই (নিজেকে পুনরাবৃত্তি করবেন না) নীতির লঙ্ঘন এড়াতে নতুন যাদু আচরণ যুক্ত করা হয়েছিল, পিইপি 3135 দেখুন । ক্লাসটিকে বিশ্বব্যাপী হিসাবে উল্লেখ করে স্পষ্টরূপে নামকরণ করা আপনার super()
নিজের সাথে আবিষ্কার করা একই পুনরায় রিমন্ডিং ইস্যুতে ঝুঁকিপূর্ণ :
class Foo(Bar):
def baz(self):
return super(Foo, self).baz() + 42
Spam = Foo
Foo = something_else()
Spam().baz() # liable to blow up
ক্লাস সাজসজ্জার ব্যবহারে এটি একই প্রযোজ্য যেখানে সাজসজ্জা একটি নতুন অবজেক্ট ফেরত দেয় যা শ্রেণীর নামটি পুনরায় প্রত্যাবর্তন করে:
@class_decorator_returning_new_class
class Foo(Bar):
def baz(self):
# Now `Foo` is a *different class*
return super(Foo, self).baz() + 42
ম্যাজিক super()
__class__
সেল আপনাকে মূল শ্রেণীর অবজেক্টে অ্যাক্সেস দিয়ে সুন্দরভাবে এই সমস্যাগুলিকে পাশ কাটিয়ে দেয়।
পিইপিকে গিডো দিয়ে লাথি মেরেছিল, যিনি প্রাথমিকভাবে super
কীওয়ার্ড হওয়ার কল্পনা করেছিলেন এবং বর্তমান শ্রেণিটি অনুসন্ধান করার জন্য একটি সেল ব্যবহার করার ধারণাটিও তাঁর ছিল । অবশ্যই, এটির কীওয়ার্ড করার ধারণাটি পিইপি- র প্রথম খসড়ার অংশ ছিল ।
তবে, আসলে গুইডো নিজেই এর পরিবর্তে বর্তমান বাস্তবায়নের প্রস্তাব দিয়ে 'খুব জাদুকরী' হিসাবে মূলশব্দ ধারণাটি থেকে সরে এসেছিলেন । তিনি অনুমান করেছিলেন যে এর জন্য আলাদা নাম ব্যবহার super()
করা সমস্যা হতে পারে :
আমার প্যাচ একটি মধ্যবর্তী সমাধান ব্যবহার করে: এটি ধরে নেয় __class__
যখনই আপনি নাম পরিবর্তনশীল ব্যবহার করেন 'super'
। সুতরাং, যদি আপনি (বিশ্বব্যাপী) নাম পরিবর্তন super
করে supper
ব্যবহার করেন supper
তবে ব্যবহার করেন না super
, এটি তর্ক ছাড়াই কাজ করবে না (তবে এটি আপনি যদি হয় __class__
বা প্রকৃত শ্রেণীর বস্তুটি পাস করেন তবে এটি কাজ করবে
); আপনার যদি নামের সাথে কোনও সম্পর্কযুক্ত ভেরিয়েবল থাকে super
তবে জিনিসগুলি কাজ করবে তবে পদ্ধতিটি ভেরিয়েবলের জন্য সামান্য ধীর কল কল ব্যবহার করবে।
সুতরাং, শেষ পর্যন্ত, নিজেই গুইডো ঘোষণা করেছিলেন যে কোনও super
কীওয়ার্ড ব্যবহার করা সঠিক মনে হচ্ছে না এবং একটি যাদু __class__
ঘর সরবরাহ করা একটি গ্রহণযোগ্য আপস ছিল।
আমি সম্মত হচ্ছি যে বাস্তবায়নের যাদু, অন্তর্নিহিত আচরণ কিছুটা অবাক করা হলেও super()
ভাষাটির মধ্যে সবচেয়ে বেশি ভুল-প্রয়োগকৃত কাজ। ইন্টারনেটে পাওয়া সমস্ত অপ্রয়োগিত super(type(self), self)
বা super(self.__class__, self)
অনুরোধগুলির দিকে একবার নজর দিন ; যদি সেই কোডটির কোনওটি যদি কখনও উদ্ভূত শ্রেণীর কাছ থেকে কল করা হয় তবে আপনি অসীম পুনরাবৃত্তি ব্যতিক্রম সহ শেষ করতে চান । অন্ততপক্ষে সরলীকৃত এ super()
কল, আর্গুমেন্ট ছাড়াই এড়াতে যে সমস্যা।
নাম পরিবর্তন হিসাবে super_
; শুধু রেফারেন্স __class__
আপনার পদ্ধতিতে পাশাপাশি এবং এটি আবার কাজ করব। আপনি যদি আপনার পদ্ধতির নাম super
বা __class__
নাম উল্লেখ করেন তবে ঘরটি তৈরি করা হয়েছে :
>>> super_ = super
>>> class A(object):
... def x(self):
... print("No flipping")
...
>>> class B(A):
... def x(self):
... __class__ # just referencing it is enough
... super_().x()
...
>>> B().x()
No flipping