পাইথনে একই ফাইলে একাধিক ক্লাস করা ঠিক কি?
হ্যাঁ. উভয়ই দার্শনিক দৃষ্টিভঙ্গির পাশাপাশি ব্যবহারিক দিক থেকেও।
পাইথনে, মডিউলগুলি এমন একটি নেমস্পেস যা স্মৃতিতে একবারে উপস্থিত হয়।
বলুন যে আমাদের প্রতি ফাইলের জন্য একটি শ্রেণি সংজ্ঞায়িত করে নিম্নলিখিত অনুমানিক ডিরেক্টরি কাঠামোটি ছিল:
Defines
abc/
|-- callable.py Callable
|-- container.py Container
|-- hashable.py Hashable
|-- iterable.py Iterable
|-- iterator.py Iterator
|-- sized.py Sized
... 19 more
এই শ্রেণীর collectionsসমস্তগুলি মডিউলে এবং (সেখানে প্রকৃতপক্ষে 25 টি রয়েছে) স্ট্যান্ডার্ড লাইব্রেরি মডিউলে সংজ্ঞায়িত_collections_abc.py
এখানে বেশ কয়েকটি সমস্যা রয়েছে যা আমি বিশ্বাস করি _collections_abc.pyবিকল্প অনুমানমূলক ডিরেক্টরি কাঠামোর চেয়ে উচ্চতর করে তোলে ।
- এই ফাইলগুলি বর্ণমালা অনুসারে বাছাই করা হয়। আপনি এগুলি অন্য উপায়ে বাছাই করতে পারেন তবে আমি এমন কোনও বৈশিষ্ট্য সম্পর্কে অবগত নই যা শব্দার্থ নির্ভরতা অনুসারে ফাইলগুলি সাজায়। _Collections_abc মডিউল উত্স নির্ভরতা দ্বারা সংগঠিত হয়।
- অ-প্যাথলজিকাল ক্ষেত্রে মডিউল এবং শ্রেণি সংজ্ঞা উভয়ই একক স্মরণে মেমরির মধ্যে একবার হয়। ক্লাসগুলিতে মডিউলগুলির একটি বাইজিক ম্যাপিং থাকবে - মডিউলগুলি অপ্রয়োজনীয় করে তোলে।
- ফাইলগুলির ক্রমবর্ধমান সংখ্যাটি ক্লাসগুলির মাধ্যমে পড়ার জন্য কম সুবিধাজনক করে তোলে (যদি আপনার কোনও আইডিই না থাকে যা এটি সহজ করে তোলে) - এটি সরঞ্জাম ছাড়াই লোকেদের পক্ষে কম অ্যাক্সেসযোগ্য করে তোলে।
আপনি যখন নাম সারণী এবং সাংগঠনিক দৃষ্টিকোণ থেকে পছন্দসই দেখতে পান তখন কি বিভিন্ন শ্রেণীর গোষ্ঠীগুলিকে বিভিন্ন মডিউলে বিভক্ত করা থেকে বিরত রাখা হয়?
না।
পাইথনের জেন থেকে, এটি যে দর্শন এবং নীতিগুলির অধীনে এটি বেড়ে ওঠে তা প্রতিফলিত করে:
নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!
তবে আসুন আমরা এটি মনে রাখি যে:
ফ্ল্যাট বাসা থেকে ভাল।
পাইথন অবিশ্বাস্যরূপে পরিষ্কার এবং পড়া সহজ। এটি আপনাকে পড়তে উত্সাহ দেয়। পৃথক ফাইলে প্রতিটি পৃথক শ্রেণি স্থাপন পাঠকে নিরুৎসাহিত করে। এটি পাইথনের মূল দর্শনের বিরুদ্ধে যায়। স্ট্যান্ডার্ড লাইব্রেরির কাঠামোটি দেখুন , মডিউলগুলির সিংহভাগ হ'ল একক-ফাইল মডিউল, প্যাকেজ নয়। আমি আপনাকে জমা দেব যে আইডেমোমেটিক পাইথন কোড সিপিথন স্ট্যান্ডার্ড লাইবের মতো একই স্টাইলে লেখা হয়েছে।
বিমূর্ত বেস ক্লাস মডিউল থেকে আসল কোডটি এখানে । আমি এটিকে ভাষাতে বিভিন্ন বিমূর্তের বর্ণ বোঝার জন্য একটি রেফারেন্স হিসাবে ব্যবহার করতে চাই।
আপনি কি বলতে পারবেন যে এই ক্লাসগুলির প্রত্যেকের জন্য একটি পৃথক ফাইলের প্রয়োজন?
class Hashable:
__metaclass__ = ABCMeta
@abstractmethod
def __hash__(self):
return 0
@classmethod
def __subclasshook__(cls, C):
if cls is Hashable:
try:
for B in C.__mro__:
if "__hash__" in B.__dict__:
if B.__dict__["__hash__"]:
return True
break
except AttributeError:
# Old-style class
if getattr(C, "__hash__", None):
return True
return NotImplemented
class Iterable:
__metaclass__ = ABCMeta
@abstractmethod
def __iter__(self):
while False:
yield None
@classmethod
def __subclasshook__(cls, C):
if cls is Iterable:
if _hasattr(C, "__iter__"):
return True
return NotImplemented
Iterable.register(str)
class Iterator(Iterable):
@abstractmethod
def next(self):
'Return the next item from the iterator. When exhausted, raise StopIteration'
raise StopIteration
def __iter__(self):
return self
@classmethod
def __subclasshook__(cls, C):
if cls is Iterator:
if _hasattr(C, "next") and _hasattr(C, "__iter__"):
return True
return NotImplemented
class Sized:
__metaclass__ = ABCMeta
@abstractmethod
def __len__(self):
return 0
@classmethod
def __subclasshook__(cls, C):
if cls is Sized:
if _hasattr(C, "__len__"):
return True
return NotImplemented
class Container:
__metaclass__ = ABCMeta
@abstractmethod
def __contains__(self, x):
return False
@classmethod
def __subclasshook__(cls, C):
if cls is Container:
if _hasattr(C, "__contains__"):
return True
return NotImplemented
class Callable:
__metaclass__ = ABCMeta
@abstractmethod
def __call__(self, *args, **kwds):
return False
@classmethod
def __subclasshook__(cls, C):
if cls is Callable:
if _hasattr(C, "__call__"):
return True
return NotImplemented
সুতরাং তাদের প্রত্যেকের নিজস্ব ফাইল থাকা উচিত?
আমি আশা করি না.
এই ফাইলগুলি কেবল কোড নয় - এগুলি পাইথনের শব্দার্থবিজ্ঞানের ডকুমেন্টেশন।
এগুলি সম্ভবত গড়ে 10 থেকে 20 লাইন। আমাকে আরও 10 লাইন কোডের কোড দেখতে কেন একটি সম্পূর্ণ পৃথক ফাইলে যেতে হবে? এটি অত্যন্ত অবৈধ হবে। এছাড়াও, প্রতিটি ফাইলটিতে প্রায় একই রকম বয়লারপ্লেট আমদানি হবে, কোডের আরও বেশি অপ্রয়োজনীয় লাইন যুক্ত করবে।
আমি এটি জেনে রাখা বেশ দরকারী যে এখানে একটি একক মডিউল রয়েছে যেখানে আমি এই সমস্ত অ্যাবস্ট্রাক্ট বেস শ্রেণিগুলি খুঁজে পেতে পারি, তার পরিবর্তে মডিউলগুলির একটি তালিকা দেখার প্রয়োজন নেই। একে অপরের সাথে প্রসঙ্গে তাদের দেখার বিষয়টি আমাকে আরও ভালভাবে বুঝতে সাহায্য করে। আমি যখন দেখি যে একজন ইলিট্রেটর একটি আইটেবল, আমি ঝটপট করে ঝাঁকুনির দ্বারা কোনও আইট্রেবলের কী কী থাকে তা আমি তাড়াতাড়ি পর্যালোচনা করতে পারি।
আমি মাঝেমধ্যে খুব সংক্ষিপ্ত ক্লাসের দু'টি করে চলেছি। সময়ের সাথে আরও বড় হওয়ার প্রয়োজন থাকলেও তারা ফাইলটিতে থাকে stay কখনও কখনও পরিপক্ক মডিউলগুলির 1000 টিরও বেশি কোড থাকে। তবে সিটিআরএল-এফ সহজ, এবং কিছু আইডিই ফাইলের বাহ্যরেখা দেখতে সহজ করে তোলে - সুতরাং ফাইলটি যত বড়ই হোক না কেন, আপনি যে কোনও বস্তু বা পদ্ধতিটি সন্ধান করছেন তাড়াতাড়ি আপনি যেতে পারেন।
উপসংহার
পাইথনের প্রসঙ্গে আমার দিকনির্দেশনাটি একই ফাইলটিতে সম্পর্কিত এবং শব্দার্থগতভাবে অনুরূপ শ্রেণীর সংজ্ঞা রাখতে পছন্দ করা। যদি ফাইলটি এত বড় হয়ে যায় যে অযৌক্তিক হয়ে উঠতে পারে তবে একটি পুনর্গঠন বিবেচনা করুন।
class SomeException extends \Exception {}