বলুন আমার একাধিক উত্তরাধিকারের পরিস্থিতি রয়েছে:
class A(object):
# code for A here
class B(object):
# code for B here
class C(A, B):
def __init__(self):
# What's the right code to write here to ensure
# A.__init__ and B.__init__ get called?
সেখানে লেখা দুটি টিপিক্যাল পন্থা নেই C
'র __init__
:
- (পুরাতন স্টাইল)
ParentClass.__init__(self)
- (নতুন স্টাইলের)
super(DerivedClass, self).__init__()
যাইহোক, উভয় ক্ষেত্রেই, যদি প্যারেন্ট ক্লাসগুলি ( A
এবং B
) একই কনভেনশন অনুসরণ না করে, তবে কোডটি সঠিকভাবে কাজ করবে না (কিছুটি মিস হয়ে যেতে পারে, বা একাধিকবার কল হতে পারে)।
তাহলে আবার সঠিক উপায় কী? এটি বলা সহজ "কেবল সামঞ্জস্যপূর্ণ থাকুন, একজনকে বা অন্যটিকে অনুসরণ করুন", তবে যদি A
বা B
কোনও তৃতীয় পক্ষের লাইব্রেরি থেকে থাকেন তবে তা কি? এমন কোনও দৃষ্টিভঙ্গি রয়েছে যা নিশ্চিত করতে পারে যে সমস্ত অভিভাবক শ্রেণির নির্মাতাদের ডাকা হবে (এবং সঠিক ক্রমে এবং একবারে একবার)?
সম্পাদনা করুন: আমি কী বলতে চাইছি তা দেখার জন্য:
class A(object):
def __init__(self):
print("Entering A")
super(A, self).__init__()
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
A.__init__(self)
B.__init__(self)
print("Leaving C")
তারপরে আমি পেয়েছি:
Entering C
Entering A
Entering B
Leaving B
Leaving A
Entering B
Leaving B
Leaving C
মনে রাখবেন যে B
এর আর দ্বিগুণ কল হয়েছিল। যদি আমি করি:
class A(object):
def __init__(self):
print("Entering A")
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class C(A, B):
def __init__(self):
print("Entering C")
super(C, self).__init__()
print("Leaving C")
তারপরে আমি পেয়েছি:
Entering C
Entering A
Leaving A
Leaving C
মনে রাখবেন যে B
এর আর কখনও কল হবে না। সুতরাং দেখে মনে হচ্ছে যে আমি যে ক্লাসগুলির ( আমার) উত্তরাধিকার সূত্রে জানতে পেরেছি সেগুলি সম্পর্কে জানতে / নিয়ন্ত্রণ না করা পর্যন্ত আমি ( A
এবং B
) যে ক্লাসটি লিখছি তার জন্য নিরাপদ পছন্দ করতে পারি না C
।