super()
কোনও শ্রেণিবদ্ধ, উদাহরণ পদ্ধতি বা স্ট্যাটিকমেথডের কোনও পিতামাতার সংস্করণের সমাধানের জন্য আহ্বান জানাতে গিয়ে আমরা বর্তমান শ্রেণিটি আমরা প্রথম যুক্তি হিসাবে যার স্কোপটিতে রয়েছি তা পাস করতে চাই, আমরা কোন পিতামাতার সুযোগটি আমরা সমাধান করার চেষ্টা করছি তা নির্দেশ করতে এবং দ্বিতীয় যুক্তি হ'ল আগ্রহের অবজেক্টটি চিহ্নিত করার জন্য আমরা কোন অবজেক্টে সেই সুযোগটি প্রয়োগ করার চেষ্টা করছি।
বিবেচনা করুন একটি বর্গ অনুক্রমের A
, B
এবং C
যেখানে প্রতিটি বর্গ এটা নিম্নলিখিত এক অভিভাবক, এবং a
, b
এবং c
প্রতিটি নিজ নিজ দৃষ্টান্ত।
super(B, b)
# resolves to the scope of B's parent i.e. A
# and applies that scope to b, as if b was an instance of A
super(C, c)
# resolves to the scope of C's parent i.e. B
# and applies that scope to c
super(B, c)
# resolves to the scope of B's parent i.e. A
# and applies that scope to c
super
একটি স্ট্যাটিকমেডোথের সাথে ব্যবহার করা
যেমন পদ্ধতি super()
মধ্যে থেকে ব্যবহার__new__()
class A(object):
def __new__(cls, *a, **kw):
# ...
# whatever you want to specialize or override here
# ...
return super(A, cls).__new__(cls, *a, **kw)
ব্যাখ্যা:
1- যদিও এটি __new__()
প্রথম পরম হিসাবে কলিং ক্লাসের রেফারেন্স হিসাবে গ্রহণ করা স্বাভাবিক , এটি পাইথনে ক্লাসমেডুড হিসাবে প্রয়োগ করা হয় না , বরং একটি স্ট্যাটিকমেডোর হিসাবে প্রয়োগ করা হয়। এটি হ'ল, __new__()
সরাসরি কল করার সময় কোনও শ্রেণীর রেফারেন্সটি প্রথম যুক্তি হিসাবে স্পষ্টভাবে পাস করতে হবে :
# if you defined this
class A(object):
def __new__(cls):
pass
# calling this would raise a TypeError due to the missing argument
A.__new__()
# whereas this would be fine
A.__new__(A)
2- super()
অভিভাবক শ্রেণিতে উঠার জন্য যখন আমরা শিশু শ্রেণিকে A
প্রথম যুক্তি হিসাবে পাস করি তখন আমরা আগ্রহের উদ্দেশ্যে একটি রেফারেন্স পাস করি, এক্ষেত্রে এটি শ্রেণীর রেফারেন্স যা A.__new__(cls)
বলা হয়েছিল তা পাস হয়েছিল। বেশিরভাগ ক্ষেত্রে এটি শিশু শ্রেণির একটি রেফারেন্স হতে পারে। কিছু পরিস্থিতিতে এটি একাধিক প্রজন্মের উত্তরাধিকারের ক্ষেত্রে নাও হতে পারে।
super(A, cls)
3- যেহেতু একটি সাধারণ নিয়ম __new__()
একটি অবিচলিত হিসাবে, super(A, cls).__new__
তেমনি একটি স্ট্যাটিকমেডোথও ফিরিয়ে দেবে এবং এক্ষেত্রে অন্তর্দৃষ্টির বিষয়টির রেফারেন্স সহ সমস্ত যুক্তি সুস্পষ্টভাবে সরবরাহ করা দরকার cls
।
super(A, cls).__new__(cls, *a, **kw)
4- ছাড়া একই জিনিস করছেন super
class A(object):
def __new__(cls, *a, **kw):
# ...
# whatever you want to specialize or override here
# ...
return object.__new__(cls, *a, **kw)
super
একটি উদাহরণ পদ্ধতি ব্যবহার করে
যেমন super()
মধ্যে থেকে ব্যবহার__init__()
class A(object):
def __init__(self, *a, **kw):
# ...
# you make some changes here
# ...
super(A, self).__init__(*a, **kw)
ব্যাখ্যা:
1- __init__
একটি উদাহরণ পদ্ধতি, যার অর্থ এটির প্রথম যুক্তি হিসাবে কোনও উদাহরণের উল্লেখ হয়। যখন উদাহরণ থেকে সরাসরি ডাকা হয়, রেফারেন্স স্পষ্টভাবে পাস করা হয়, এটাই আপনাকে এটি নির্দিষ্ট করার দরকার নেই:
# you try calling `__init__()` from the class without specifying an instance
# and a TypeError is raised due to the expected but missing reference
A.__init__() # TypeError ...
# you create an instance
a = A()
# you call `__init__()` from that instance and it works
a.__init__()
# you can also call `__init__()` with the class and explicitly pass the instance
A.__init__(a)
2- যখন কলিং super()
মধ্যে __init__()
আমরা প্রথম আর্গুমেন্ট হিসাবে সন্তানের শ্রেণী এবং একটি দ্বিতীয় যুক্তি, যা সাধারণভাবে শিশু ক্লাসের একটা নিদর্শন একটি রেফারেন্স হিসাবে সুদ বস্তুর পাস।
super(A, self)
3- কলটি super(A, self)
এমন একটি প্রক্সি প্রদান করে যা সুযোগটি সমাধান করবে এবং এটিকে self
এমনভাবে প্রয়োগ করবে যেন এটি এখন পিতামাতার শ্রেণীর উদাহরণ। আসুন যে প্রক্সি কল s
। যেহেতু __init__()
একটি উদাহরণ পদ্ধতি হ'ল কলটি পিতামাতার কাছে প্রথম যুক্তি হিসাবে s.__init__(...)
একটি সূত্রটি স্পষ্টভাবে প্রেরণ করবে ।self
__init__()
4- super
আমাদের পিতামাতার সংস্করণটিতে স্পষ্টভাবে একটি উদাহরণের একটি রেফারেন্স দেওয়ার প্রয়োজন ছাড়াই এটি করার জন্য __init__()
।
class A(object):
def __init__(self, *a, **kw):
# ...
# you make some changes here
# ...
object.__init__(self, *a, **kw)
super
একটি শ্রেণিবদ্ধ সঙ্গে ব্যবহার করে
class A(object):
@classmethod
def alternate_constructor(cls, *a, **kw):
print "A.alternate_constructor called"
return cls(*a, **kw)
class B(A):
@classmethod
def alternate_constructor(cls, *a, **kw):
# ...
# whatever you want to specialize or override here
# ...
print "B.alternate_constructor called"
return super(B, cls).alternate_constructor(*a, **kw)
ব্যাখ্যা:
1- একটি শ্রেণিবদ্ধকে সরাসরি শ্রেণি থেকে ডাকা যায় এবং তার প্রথম পরামিতি হিসাবে শ্রেণীর রেফারেন্স গ্রহণ করে।
# calling directly from the class is fine,
# a reference to the class is passed implicitly
a = A.alternate_constructor()
b = B.alternate_constructor()
২- যখন super()
কোনও শ্রেণিবদ্ধের কাছে এর পিতামাতার সংস্করণটি সমাধান করার জন্য আহ্বান জানানো হয়, তখন আমরা কোন শিশু পিতৃতন্ত্রের সুযোগটি আমরা সমাধান করতে চাইছি তা নির্দেশ করার জন্য বর্তমান শিশু শ্রেণিটিকে প্রথম যুক্তি হিসাবে পাস করতে চাই এবং আগ্রহের বিষয়টিকে দ্বিতীয় যুক্তি হিসাবে দেখি আমরা কোন অবজেক্টে সেই সুযোগটি প্রয়োগ করতে চাই তা নির্দেশ করার জন্য, যা সাধারণত শিশু বর্গ নিজেই বা এর একটি সাবক্লাসের একটি রেফারেন্স।
super(B, cls_or_subcls)
3- কলটি এর super(B, cls)
পরিসীমাতে সমাধান হয় A
এবং এটি প্রয়োগ করে cls
। যেহেতু alternate_constructor()
একটি শ্রেণিবদ্ধ, কলটি স্পষ্টভাবে এর সংস্করণের সংস্করণটির প্রথম যুক্তি হিসাবে super(B, cls).alternate_constructor(...)
একটি রেফারেন্স পাস করবে passcls
A
alternate_constructor()
super(B, cls).alternate_constructor()
4- ব্যবহার না করেই এটি করার জন্য super()
আপনাকে আনবাউন্ড সংস্করণটির A.alternate_constructor()
(যেমন ফাংশনের সুস্পষ্ট সংস্করণ) রেফারেন্স পেতে হবে । কেবল এটি করা কার্যকর হবে না:
class B(A):
@classmethod
def alternate_constructor(cls, *a, **kw):
# ...
# whatever you want to specialize or override here
# ...
print "B.alternate_constructor called"
return A.alternate_constructor(cls, *a, **kw)
উপরের কাজ করবে না কারণ A.alternate_constructor()
পদ্ধতিটি A
তার প্রথম যুক্তি হিসাবে একটি অন্তর্নিহিত রেফারেন্স নেয় । এখানে cls
পাস করা এটি দ্বিতীয় যুক্তি হবে।
class B(A):
@classmethod
def alternate_constructor(cls, *a, **kw):
# ...
# whatever you want to specialize or override here
# ...
print "B.alternate_constructor called"
# first we get a reference to the unbound
# `A.alternate_constructor` function
unbound_func = A.alternate_constructor.im_func
# now we call it and pass our own `cls` as its first argument
return unbound_func(cls, *a, **kw)