শ্রেণি ঘোষণার উত্তরাধিকারী হওয়ার কি কোনও কারণ আছে object
?
আমি সবেমাত্র এমন কিছু কোড পেয়েছি যা এটি করে এবং এর কোনও ভাল কারণ খুঁজে পাচ্ছি না।
class MyClass(object):
# class code follows...
শ্রেণি ঘোষণার উত্তরাধিকারী হওয়ার কি কোনও কারণ আছে object
?
আমি সবেমাত্র এমন কিছু কোড পেয়েছি যা এটি করে এবং এর কোনও ভাল কারণ খুঁজে পাচ্ছি না।
class MyClass(object):
# class code follows...
উত্তর:
শ্রেণি ঘোষণার উত্তরাধিকারী হওয়ার কি কোনও কারণ আছে
object
?
পাইথন 3-তে পাইথন 2 এবং 3 এর মধ্যে সামঞ্জস্যতা ছাড়াও কোনও কারণ নেই । পাইথন 2 এ, অনেকগুলি কারণ ।
পাইথন ২.x-এ (২.২ থেকে পরবর্তী) object
বেস-ক্লাস হিসাবে উপস্থিতি বা অনুপস্থিতির উপর নির্ভর করে ক্লাসগুলির দুটি স্টাইল রয়েছে :
"ক্লাসিক" স্টাইলের ক্লাস: তাদের object
বেস ক্লাস হিসাবে নেই:
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()
"নতুন" স্টাইলের ক্লাসগুলি: তাদের বেস বা ক্লাস হিসাবে প্রত্যক্ষ বা অপ্রত্যক্ষভাবে (যেমন একটি বিল্ট-ইন টাইপের উত্তরাধিকারী ) রয়েছে object
:
>>> class NewSpam(object): # directly inherit from object
... pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int): # indirectly inherit from object...
... pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object
(<type 'object'>,)
কোনও সন্দেহ নেই, কোনও ক্লাস লেখার সময় আপনি সর্বদা নতুন-স্টাইলের ক্লাসে যেতে চাইবেন। এগুলি করার অনুমতিগুলি অসংখ্য, তাদের কয়েকটি তালিকাবদ্ধ করার জন্য:
বর্ণনাকারী জন্য সমর্থন । বিশেষত, বর্ণনাকারীদের দ্বারা নিম্নলিখিত নির্মাণগুলি সম্ভব হয়েছে:
classmethod
: এমন একটি পদ্ধতি যা ক্লাসটিকে উদাহরণের পরিবর্তে অন্তর্নিহিত যুক্তি হিসাবে গ্রহণ করে।staticmethod
: এমন একটি পদ্ধতি যা self
প্রথম যুক্তি হিসাবে অন্তর্নিহিত যুক্তি পায় না ।property
: কোনও বৈশিষ্ট্য অর্জন, সেটিংস এবং মুছতে পরিচালনার জন্য ফাংশন তৈরি করুন।__slots__
: একটি শ্রেণীর মেমরির কনসপশনগুলি সংরক্ষণ করে এবং দ্রুত অ্যাট্রিবিউট অ্যাক্সেসের ফলাফলও দেয়। অবশ্যই, এটি সীমাবদ্ধতা আরোপ করে না ।__new__
স্ট্যাটিক পদ্ধতি: আপনি কাস্টমাইজ নতুন বর্গ দৃষ্টান্ত নির্মিত দেয়।
পদ্ধতি সমাধানের আদেশ (এমআরও) : কোন পদ্ধতিতে কল করতে হবে তা সমাধান করার চেষ্টা করার সময় কোন শ্রেণীর বেস শ্রেণিগুলি কী আদেশে অনুসন্ধান করা হবে।
এমআরও সম্পর্কিত, super
কলগুলি । এছাড়াও, দেখুন super()
সুপার বিবেচিত।
আপনি যদি উত্তরাধিকারসূত্রে না হন তবে object
এগুলি ভুলে যান। "নতুন" স্টাইলের ক্লাসের অন্যান্য পার্কগুলির সাথে আগের বুলেট পয়েন্টগুলির আরও বিশদ বিবরণ এখানে পাওয়া যাবে ।
নতুন-স্টাইলের ক্লাসগুলির একটি ডাউনসাইড হ'ল ক্লাসটি নিজেই বেশি মেমরির দাবি করে। যদিও আপনি অনেকগুলি শ্রেণি অবজেক্ট তৈরি না করেন, তবে আমি সন্দেহ করি এটি একটি সমস্যা হবে এবং এটি ইতিবাচক সমুদ্রে নেতিবাচক ডুবেছে।
পাইথন 3 এ, জিনিসগুলি সরল করা হয়েছে। কেবলমাত্র নতুন-স্টাইলের ক্লাস রয়েছে (ক্লাস হিসাবে ক্লাস হিসাবে উল্লেখ করা হয়) সুতরাং যুক্ত করার object
ক্ষেত্রে কেবলমাত্র পার্থক্য আপনাকে আরও 8 টি অক্ষর টাইপ করতে হবে। এই:
class ClassicSpam:
pass
সম্পূর্ণ সমতুল্য (তাদের নাম :-) বাদে এটি:
class NewSpam(object):
pass
এবং এটি:
class Spam():
pass
সব object
তাদের আছে __bases__
।
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
পাইথন 2 এ: সর্বদা object
সুস্পষ্টভাবে উত্তরাধিকারী হন । পারফেসস পান
পাইথন 3: উত্তরাধিকারী থেকে object
আপনি কোড লেখা হয় চেষ্টা পাইথন অজ্ঞেয়বাদী হতে, যে, এটা পাইথন 2 এবং পাইথন 3. উভয় কাজ করার প্রয়োজন তা না হলে না, এটা সত্যিই কোন পার্থক্য যেহেতু পাইথন এটা আপনার জন্য সন্নিবেশ তোলে না দৃশ্যের অন্তরালে.
object
। আইআইআরসি সময়ে একটা পয়েন্ট ছিল যেখানে সমস্ত বিল্টিন ধরণের নয় যেখানে এখনও নতুন স্টাইলের ক্লাসে পোর্ট করা হয়েছে।
object
। আমার কাছে পাইথনটি প্রায় ২.২.৩ রয়েছে এবং দ্রুত চেক করার পরে আমি কোনও অপরাধীকে খুঁজে পেলাম না, তবে উত্তরটি পরে আরও স্পষ্ট করে লিখব। আগ্রহী হবেন যদি আপনি উদাহরণটি খুঁজে পেতে পারেন তবে, আমার কৌতূহল শঙ্কিত।
object
করে এটির ঘাঁটিতে রয়েছে।
staticmethod
এবং classmethod
পুরানো-শৈলীর ক্লাসেও ঠিক কাজ করে। property
বাছাই পুরাতন স্টাইলের ক্লাসগুলিতে পড়ার জন্য কাজ করে, এটি কেবল লেখাগুলিকে বাধা দিতে ব্যর্থ হয় (সুতরাং আপনি যদি নামটি অর্পণ করেন, উদাহরণটি প্রদত্ত নামের একটি বৈশিষ্ট্য অর্জন করে যা সম্পত্তিটির ছায়া দেয়)। এছাড়াও নোট করুন যে __slots__
অ্যাক্সেসের গতিতে অ্যাট্রিবিউটের উন্নতি হ'ল মূলত নতুন শৈলীর শ্রেণীর অ্যাট্রিবিউট অ্যাক্সেসের ক্ষতিটি পূর্বাবস্থায় ফিরিয়ে আনার বিষয়ে, সুতরাং এটি সত্যই নতুন শৈলীর শ্রেণীর বিক্রয় কেন্দ্র নয় (মেমরি সঞ্চয় যদিও বিক্রয়ের পয়েন্ট)।
পাইথন ঘ
class MyClass(object):
= নতুন স্টাইলের ক্লাসclass MyClass:
= নতুন স্টাইলের ক্লাস (এর থেকে স্পষ্টত উত্তরাধিকার সূত্রে প্রাপ্ত object
)পাইথন 2
class MyClass(object):
= নতুন স্টাইলের ক্লাসclass MyClass:
= পুরানো স্টাইল শ্রেণিব্যাখ্যা :
পাইথন 3.x এ বেস ক্লাসগুলি সংজ্ঞায়িত করার সময়, আপনাকে object
সংজ্ঞা থেকে ড্রপ করার অনুমতি দেওয়া হয় । তবে, এটি সমস্যাটিকে ট্র্যাক করার জন্য মারাত্মক শক্তির জন্য দরজাটি খুলতে পারে…
পাইথন নতুন স্টাইলের ক্লাসগুলি পাইথন ২.২ এ ফিরে এসেছিল এবং এখন অবধি প্রাচীন স্টাইলের ক্লাসগুলি বেশ পুরানো হয়ে গেছে। পুরানো স্টাইলের ক্লাসগুলির আলোচনাটি 2.x ডক্সে সমাধিস্থ করা হয়েছে এবং 3.x ডক্সে নেই non
সমস্যাটি হচ্ছে, পাইথন ২.x এর পুরানো-শৈলিক শ্রেণীর জন্য বাক্য গঠনটি পাইথন ৩.x নতুন স্টাইলের ক্লাসগুলির বিকল্প সিনট্যাক্সের মতো । পাইথন ২.x এখনও বহুল ব্যবহৃত হয় (উদাঃ জিএই, ওয়েব টুপি) এবং যে কোনও কোড (বা কোডার) অজান্তেই ২.x কোডে ৩.x-স্টাইলের শ্রেণি সংজ্ঞা আনছে কিছু মারাত্মক পুরানো বেস অবজেক্টের সাথে শেষ হতে চলেছে। এবং যেহেতু পুরাতন স্টাইলের ক্লাসগুলি কারও রাডারে নেই, তারা সম্ভবত বুঝতে পারে না যে তাদের কী আঘাত করেছে।
সুতরাং কেবল এটিকে দীর্ঘ পথ বানান এবং কিছু 2.x বিকাশকারীকে অশ্রুগুলি সঞ্চয় করুন।
__metaclass__ = type
মডিউলের শীর্ষে রেখেছি ( from __future__ import absolute_import, division, print_function
লাইনের পরে :-)); এটি পাই 2 এর একটি সামঞ্জস্যতা হ্যাক যা মডিউলটিকে পরবর্তীকালে সংজ্ঞায়িত শ্রেণিগুলি ডিফল্টরূপে নতুন স্টাইলে তৈরি করে এবং পাই 3 এ এটি সম্পূর্ণ উপেক্ষা করা হয় (কেবলমাত্র একটি এলোমেলো বৈশ্বিক পরিবর্তনশীল বসে আছে), সুতরাং এটি নিরীহ।
হ্যাঁ, এটি একটি 'নতুন স্টাইল' অবজেক্ট। এটি পাইথন ২.২ এ উপস্থাপন করা একটি বৈশিষ্ট্য ছিল।
নতুন স্টাইলের অবজেক্টগুলির ক্লাসিক অবজেক্টগুলির কাছে আলাদা আলাদা অবজেক্টের মডেল রয়েছে এবং কিছু জিনিস উদাহরণস্বরূপ super()
, @property
এবং বর্ণনাকারীদের সাথে পুরানো স্টাইলের জিনিসগুলির সাথে সঠিকভাবে কাজ করবে না । একটি নতুন শৈলী শ্রেণি কী হয় তার একটি ভাল বর্ণনার জন্য এই নিবন্ধটি দেখুন ।
পার্থক্যের বিবরণের জন্য এসও লিঙ্ক: পাইথনের পুরাতন স্টাইল এবং নতুন স্টাইলের ক্লাসগুলির মধ্যে পার্থক্য কী?
object
পাইথন 2 এ উত্তরাধিকারী হওয়া দরকার
পাইথন থেকে হার্ড ওয়ে শিখুন ইতিহাস :
পাইথনের ক্লাসের মূল উপস্থাপনাটি অনেক মারাত্মক উপায়ে ভেঙে যায়। এই ত্রুটিটি সনাক্ত হওয়ার সময় এটি ইতিমধ্যে অনেক দেরি হয়ে গেছে এবং তাদের এটি সমর্থন করতে হয়েছিল। সমস্যাটি সমাধান করার জন্য তাদের কিছু "নতুন শ্রেণি" শৈলীর প্রয়োজন ছিল যাতে "পুরাতন শ্রেণিগুলি" কাজ করে যেতে পারে তবে আপনি নতুন আরও সঠিক সংস্করণটি ব্যবহার করতে পারেন।
তারা সিদ্ধান্ত নিয়েছে যে ক্লাস তৈরির জন্য আপনি উত্তরাধিকার সূত্রে প্রাপ্ত "শ্রেণি" হতে তারা নিম্নবিত্ত একটি শব্দ "অবজেক্ট" ব্যবহার করবে। এটি বিভ্রান্তিকর, তবে একটি শ্রেণি বর্গ তৈরির জন্য "অবজেক্ট" নামে শ্রেণীর উত্তরাধিকার সূত্রে আসে তবে এটি কোনও বস্তু আসলে তার শ্রেণি নয়, তবে অবজেক্ট থেকে উত্তরাধিকারী হতে ভুলবেন না।
নতুন স্টাইলের ক্লাস এবং পুরানো স্টাইলের ক্লাসগুলির মধ্যে পার্থক্য কী তা কেবল আপনাকে জানাতেই, নতুন স্টাইলের ক্লাসগুলি সর্বদা ক্লাস থেকে object
বা অন্য শ্রেণীর কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় object
:
class NewStyle(object):
pass
আরেকটি উদাহরণ হ'ল:
class AnotherExampleOfNewStyle(NewStyle):
pass
একটি পুরানো-শৈলীর বেস শ্রেণীর মতো দেখতে:
class OldStyle():
pass
এবং একটি পুরাতন স্টাইলের শিশু শ্রেণিটি এরকম দেখাচ্ছে:
class OldStyleSubclass(OldStyle):
pass
আপনি দেখতে পাচ্ছেন যে ওল্ড স্টাইলের বেস শ্রেণিটি অন্য কোনও শ্রেণির থেকে উত্তরাধিকারী নয়, তবে ওল্ড স্টাইলের ক্লাসগুলি অবশ্যই একে অপরের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে। অবজেক্ট থেকে উত্তোলন গ্যারান্টি দেয় যে প্রতিটি পাইথন ক্লাসে নির্দিষ্ট কার্যকারিতা পাওয়া যায়। পাইথন ২.২ এ নতুন স্টাইলের ক্লাস চালু করা হয়েছিল
object
সব বিভ্রান্তিকর নয় এবং বাস্তবে এটি বেশ মানক। স্মল্টালকের একটি মূল শ্রেণি রয়েছে Object
, এবং একটি মূল মেটাক্লাসের নাম রয়েছে Class
। কেন? কারণ, যেমন Dog
কুকুরের Object
জন্য একটি শ্রেণি, বস্তুর জন্য একটি শ্রেণি, এবং Class
শ্রেণীর জন্য একটি শ্রেণি class জাভা, সি #, ওবিজেসি, রুবি এবং অন্যান্য শ্রেণিভিত্তিক ওও ভাষাগুলি যেগুলি আজ মানুষ ব্যবহার করে যার মূল শ্রেণি রয়েছে Object
কেবল পাইথন নয়, নামের কিছুটা প্রকরণ ব্যবহার করে।
হ্যাঁ, এটি .তিহাসিক । এটি ছাড়া এটি একটি পুরানো ধাঁচের শ্রেণি তৈরি করে।
আপনি যদি type()
কোনও পুরানো স্টাইলের অবজেক্টে ব্যবহার করেন তবে আপনি কেবল "উদাহরণ" পাবেন। একটি নতুন স্টাইলের অবজেক্টে আপনি এর ক্লাস পাবেন।
type()
কোনও পুরানো শৈলীর ক্লাসে ব্যবহার করেন তবে আপনি "টাইপ" এর পরিবর্তে "শ্রেণীবজ" পাবেন।
শ্রেণি তৈরির বিবৃতিটির বাক্য গঠন:
class <ClassName>(superclass):
#code follows
আপনি বিশেষত যে কোনও সুপারক্লাসের উত্তরাধিকারী হতে চান তার অভাবে, superclass
সর্বদা হওয়া উচিত object
, যা পাইথনের সমস্ত শ্রেণির মূল।
object
প্রযুক্তিগতভাবে পাইথনের "নতুন ধাঁচের" শ্রেণির মূল। তবে নতুন স্টাইলের ক্লাসগুলি আজ ক্লাসের একমাত্র শৈলী হওয়ার মতোই দুর্দান্ত।
তবে, object
ক্লাস তৈরি করার সময় আপনি যদি শব্দটি স্পষ্টভাবে ব্যবহার না করেন , তবে অন্যরা যেমন উল্লেখ করেছেন, পাইথন ৩.x স্পষ্টতই object
সুপারক্লাস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত । তবে আমি অনুমান করি সুস্পষ্টতা সর্বদা অন্তর্নিহিতের চেয়ে ভাল (নরক)