ক্লাসগুলি একটি মেটাক্লাসের উদাহরণ হিসাবে, এটি অপ্রত্যাশিত নয় যে মেটাক্লাসের একটি "উদাহরণ পদ্ধতি" শ্রেণীবদ্ধের মতো আচরণ করবে।
তবে, হ্যাঁ, পার্থক্য রয়েছে - এবং এর মধ্যে কিছুগুলি শব্দার্থবিজ্ঞানের চেয়ে বেশি:
- সর্বাধিক গুরুত্বপূর্ণ পার্থক্যটি হ'ল মেটাক্লাসের কোনও পদ্ধতি কোনও শ্রেণীর উদাহরণ থেকে "দৃশ্যমান" নয় । এটি ঘটে কারণ পাইথনে অ্যাট্রিবিউট অনুসন্ধান (সরল পদ্ধতিতে - বর্ণনাকারীরা অগ্রাধিকার নিতে পারে) উদাহরণটিতে কোনও বৈশিষ্ট্যের সন্ধান করুন - যদি উদাহরণটিতে উপস্থিত না থাকে, পাইথন তারপরে সেই উদাহরণটির শ্রেণিতে দেখায় এবং তারপরে অনুসন্ধান চালিয়ে যায় ক্লাসের superclasses, কিন্তু ক্লাসের ক্লাস করেন। পাইথন stdlib
abc.ABCMeta.registerপদ্ধতিতে এই বৈশিষ্ট্যটি ব্যবহার করে । এই বৈশিষ্ট্যটি ভাল হিসাবে ব্যবহার করা যেতে পারে, কারণ শ্রেণীর সাথে সম্পর্কিত পদ্ধতিগুলি কোনও দ্বন্দ্ব ছাড়াই উদাহরণস্বরূপ বৈশিষ্ট্য হিসাবে পুনরায় ব্যবহার করা মুক্ত (তবে কোনও পদ্ধতি এখনও বিরোধে লিপ্ত হবে)।
- যদি আপনি বিভিন্ন শ্রেণী শ্রেণীবিন্যাসের আছে, এ সব এর সাথে সম্পর্কিত না - আরেকটি পার্থক্য, যদিও সুস্পষ্ট, একটি পদ্ধতি ঘোষিত যে ক্লাসের অধীনে একটি ক্লাস বিভিন্ন শ্রেণীর পাওয়া হতে পারে, অন্যথায় এর সাথে সম্পর্কিত নয় কি তারা সাথে মোকাবিলা কিন্তু সব শ্রেণীর জন্য কিছু সাধারণ বৈশিষ্ট্য চান , আপনাকে একটি মিক্সিন ক্লাস নিয়ে আসতে হবে, যে উভয় স্তরক্রমের ভিত্তি হিসাবে অন্তর্ভুক্ত করতে হবে (অ্যাপ্লিকেশন রেজিস্ট্রিতে সমস্ত শ্রেণি অন্তর্ভুক্ত করার জন্য বলুন)। (এনবি। মিশ্রণটি কখনও কখনও মেটাক্লাসের চেয়ে ভাল কল হতে পারে)
- একটি শ্রেণিবদ্ধ একটি বিশেষায়িত "শ্রেণিবদ্ধ" বা বস্তু, মেটাক্লাসের একটি পদ্ধতি একটি সাধারণ ফাংশন।
সুতরাং, এটি ঘটে যায় যে শ্রেণিবদ্ধরা যে প্রক্রিয়াটি ব্যবহার করেন এটি হ'ল " বিবরণী প্রোটোকল "। সাধারণ ফাংশনগুলির মধ্যে __get__এমন একটি পদ্ধতি রয়েছে যা selfদৃষ্টান্ত থেকে পুনরুদ্ধার করার সময় যুক্তিটি সন্নিবেশ করবে এবং শ্রেণি থেকে পুনরুদ্ধার করার সময় সেই যুক্তিটি খালি ছেড়ে দেবে, কোনও classmethodবস্তুর আলাদা থাকে __get__, যা শ্রেণি নিজেই ("মালিক") সন্নিবেশ করবে উভয় পরিস্থিতিতে প্রথম পরামিতি।
এটি বেশিরভাগ সময় ব্যবহারিক পার্থক্য তৈরি করে না, তবে আপনি যদি কোনও ক্রিয়াকলাপ হিসাবে পদ্ধতিটিতে অ্যাক্সেস চান, তবে এটিতে মেটাক্লাসের কোনও পদ্ধতির জন্য গতিগতভাবে ডিকোরিটার যুক্ত করার উদ্দেশ্যে বা অন্য কোনও, meta.methodফাংশনটি পুনরুদ্ধার করে, ব্যবহারের জন্য প্রস্তুত , যখন আপনাকে cls.my_classmethod.__func__ এটি একটি শ্রেণিবদ্ধ থেকে পুনরুদ্ধার করতে ব্যবহার করতে হয় (এবং তারপরে আপনাকে অন্য কোনও classmethodঅবজেক্ট তৈরি করতে হবে এবং এটিকে ফেরত দিতে হবে, যদি আপনি কিছু মোড়ানো করেন)।
মূলত, এটি 2 উদাহরণ:
class M1(type):
def clsmethod1(cls):
pass
class CLS1(metaclass=M1):
pass
def runtime_wrap(cls, method_name, wrapper):
mcls = type(cls)
setattr(mcls, method_name, wrapper(getatttr(mcls, method_name)))
def wrapper(classmethod):
def new_method(cls):
print("wrapper called")
return classmethod(cls)
return new_method
runtime_wrap(cls1, "clsmethod1", wrapper)
class CLS2:
@classmethod
def classmethod2(cls):
pass
def runtime_wrap2(cls, method_name, wrapper):
setattr(cls, method_name, classmethod(
wrapper(getatttr(cls, method_name).__func__)
)
)
runtime_wrap2(cls1, "clsmethod1", wrapper)
অন্য কথায়: মেটাক্লাসে সংজ্ঞায়িত একটি পদ্ধতি উদাহরণ থেকে দৃশ্যমান এবং কোনও classmethodঅবজেক্টের গুরুত্বপূর্ণ পার্থক্য বাদে , রানটাইমের সময় অন্যান্য পার্থক্যগুলি অস্পষ্ট এবং অর্থহীন বলে মনে হয় - তবে এটি ঘটে কারণ ভাষাটিতে যাওয়ার দরকার নেই শ্রেণিবদ্ধদের জন্য বিশেষ বিধিবিধানের বাইরে: শ্রেণিবদ্ধকে ঘোষণা করার উভয় পদ্ধতিই ভাষার নকশা থেকে ফলস্বরূপ সম্ভব - একটি, কারণ যে কোনও শ্রেণি নিজেই একটি বস্তু এবং অন্যটি, অনেকের মধ্যেই সম্ভাবনা হিসাবে, বর্ণনাকারী প্রোটোকলের ব্যবহার যা কোনও ব্যক্তিকে একটি উদাহরণে এবং শ্রেণিতে অ্যাট্রিবিউট অ্যাক্সেস বিশেষায়িত করতে দেয়:
classmethodBuiltin নেটিভ কোড সংজ্ঞায়িত করা হয়, কিন্তু এটি শুধু বিশুদ্ধ পাইথন কোডেড হতে পারে এবং সঠিক একই ভাবে কাজ করবে। 5 লাইন শ্রেণির বেলো অবশ্যই classmethodবিল্ট-ইন @classmethod" at all (though distinguishable through introspection such as calls toআইসনস্ট্যান্স , and evenরেপ্রেসের সাথে কোনও রানটাইম পার্থক্য না করে সজ্জা হিসাবে ব্যবহার করা যেতে পারে ):
class myclassmethod:
def __init__(self, func):
self.__func__ = func
def __get__(self, instance, owner):
return lambda *args, **kw: self.__func__(owner, *args, **kw)
এবং পদ্ধতিগুলির বাইরে, এটি মনে রাখা আকর্ষণীয় যে @propertyমেটাক্লাসের উপর যেমন একটি বিশেষ বৈশিষ্ট্যগুলি বিশেষ শ্রেণীর বৈশিষ্ট্য হিসাবে কাজ করবে, ঠিক তেমন কোনও আশ্চর্যজনক আচরণ ছাড়াই।