এই প্রশ্নের অন্য উত্তর থেকে ভাল ধারণার ভিত্তিতে আমি এর অভ্যন্তর শ্রেণি থেকে একটি বহিরাগত শ্রেণি ব্যবহার করার জন্য কিছু পাইথন কোড তৈরি করেছি । আমি মনে করি এটি সংক্ষিপ্ত, সহজ এবং বুঝতে সহজ।
class higher_level__unknown_irrelevant_name__class:
def __init__(self, ...args...):
...other code...
subclasses = self._subclass_container()
self.some_subclass = subclasses["some_subclass"]
del subclasses
def sub_function(self, ...args...):
...other code...
def _subclass_container(self):
_parent_class = self
class some_subclass:
def __init__(self):
self._parent_class = _parent_class
class subclass_2:
def __init__(self):
self._parent_class = _parent_class
return {"some_subclass": some_subclass, "subclass_2": subclass_2}
প্রধান কোড, "উত্পাদন প্রস্তুত" (কোনও মন্তব্য ছাড়াই)। প্রতিটি বন্ধনীর বন্ধনী (যেমন <x>
) প্রতিটি মানকে পছন্দসই মানের সাথে প্রতিস্থাপন করতে ভুলবেন না ।
class <higher_level_class>:
def __init__(self):
subclasses = self._subclass_container()
self.<sub_class> = subclasses[<sub_class, type string>]
del subclasses
def _subclass_container(self):
_parent_class = self
class <sub_class>:
def __init__(self):
self._parent_class = _parent_class
return {<sub_class, type string>: <sub_class>}
এই পদ্ধতিটি কীভাবে কাজ করে তার ব্যাখ্যা (প্রাথমিক পদক্ষেপ):
_subclass_container
ভেরিয়েবল অ্যাক্সেস করার জন্য মোড়ক হিসাবে কাজ করার জন্য একটি ফাংশন তৈরি করুন self
, উচ্চ স্তরের শ্রেণীর একটি রেফারেন্স (ফাংশনের অভ্যন্তরে চলমান কোড থেকে)।
নামের একটি ভেরিয়েবল তৈরি করুন _parent_class
যা self
এই ফাংশনের ভেরিয়েবলের একটি রেফারেন্স , যা উপ-শ্রেণীর _subclass_container
অ্যাক্সেস করতে পারে ( self
সাবক্লাসে অন্যান্য ভেরিয়েবলের সাথে নামের দ্বন্দ্ব এড়ায়)।
উপ-শ্রেণি / উপ-শ্রেণিগুলি অভিধান / তালিকা হিসাবে ফিরিয়ে দিন যাতে ফাংশনটিতে কল করা কোডটি _subclass_container
উপ-শ্রেণীর ভিতরে প্রবেশ করতে পারে।
ইন __init__
উচ্চ স্তরের শ্রেণী (বা যেখানে প্রয়োজন) ভিতরে ফাংশন, ফাংশন থেকে ফেরত উপ-শ্রেণীর গ্রহণ _subclass_container
পরিবর্তনশীল মধ্যে subclasses
।
subclasses
উচ্চ স্তরের শ্রেণীর বৈশিষ্ট্যগুলিতে ভেরিয়েবলের মধ্যে সঞ্চিত সাব-ক্লাস নির্ধারণ করুন ।
পরিস্থিতি সহজ করার জন্য কয়েকটি টিপস:
উচ্চ স্তরের শ্রেণিতে সাব ক্লাসগুলি নির্ধারিত করার জন্য কোড তৈরি করা সহজ এবং অনুলিপি উচ্চতর স্তরের শ্রেণি থেকে প্রাপ্ত ক্লাসগুলিতে তাদের __init__
ফাংশন পরিবর্তিত হয়েছে:
প্রধান কোডে 12 লাইনের আগে সন্নিবেশ করান:
def _subclass_init(self):
তারপরে এই ফাংশন লাইনগুলিতে 5-6 (মূল কোডের) সন্নিবেশ করান এবং 4-7 লাইনগুলি নিম্নলিখিত কোডের সাথে প্রতিস্থাপন করুন:
self._subclass_init(self)
সাবক্লাসের অনেক / অজানা পরিমাণ রয়েছে যখন উচ্চ স্তরের শ্রেণিতে অর্পণ করা সাবক্লাস তৈরি করা।
নিম্নলিখিত কোড সহ লাইন 6 প্রতিস্থাপন করুন:
for subclass_name in list(subclasses.keys()):
setattr(self, subclass_name, subclasses[subclass_name])
এই সমাধানটি কোথায় কার্যকর হবে এবং যেখানে উচ্চ স্তরের শ্রেণির নাম পাওয়া অসম্ভব হওয়া উচিত তার উদাহরণের চিত্র:
"A" ( class a:
) নামে একটি শ্রেণি তৈরি করা হয়েছে। এটিতে সাবক্লাস রয়েছে যা এটি (পিতামাতাকে) অ্যাক্সেস করতে হবে। একটি সাবক্লাসকে বলা হয় "x1"। এই সাবক্লাসে কোডটি a.run_func()
চালানো হয়।
তারপরে "বি" নামে আরও একটি শ্রেণি তৈরি হয়, এটি "এ" ( ) শ্রেণি থেকে উদ্ভূত হয় class b(a):
। এর পরে, কিছু কোড চলে b.x1()
(উপ ফাংশনটিকে বি এর "x1", একটি উত্পন্ন উপ-শ্রেণি বলে) runs এই ফাংশনটি রান a.run_func()
, ফাংশন ক্লাসের "run_func" "একটি", কলিং না , (যেমন এটি করা উচিত) ফাংশন তার পিতা বা মাতা এর "run_func", "খ" কারণ ফাংশন যা বর্গ সংজ্ঞায়িত করা হয় "একটি" সেট করা হয় উল্লেখ করতে "a" ক্লাসের ফাংশনে, যেমন এটির পিতামাতা।
এটি সমস্যার কারণ হতে পারে (উদাহরণস্বরূপ যদি ফাংশনটি a.run_func
মুছে ফেলা হয়েছে) এবং ক্লাসে কোডটি পুনরায় না লিখে একমাত্র সমাধান হ'ল "এ" শ্রেণি থেকে প্রাপ্ত সমস্ত শ্রেণীর জন্য আপডেট কোড সহ a.x1
উপ-শ্রেণীর x1
নতুন সংজ্ঞা দেওয়া যা স্পষ্টতই কঠিন এবং মূল্যবান নয় এটা।