python - সটল - একটি উদাহরণ ক্লাস ক্লাস পেতে?




পাইথন স্ট্রিং (6)

আপনি একটি স্ট্রিং হিসাবে ক্লাসের নাম চান?

instance.__class__.__name__

আমি কীভাবে ক্লাসের একটি নাম খুঁজে বের করব যা পাইথন-এ একটি বস্তুর একটি উদাহরণ তৈরি করে, যদি আমি এই কাজটি থেকে যাচ্ছি তা হল বেস বর্গ যা উদাহরণটির বর্গ তৈরি করা হয়েছে?

হয়তো মনে হচ্ছে পরিদর্শন মডিউল আমাকে এখানে সাহায্য করেছে, কিন্তু এটা আমার কাছে যা চায় তা দিতে পারে না। এবং __class__ সদস্য বিশদ করার সংক্ষিপ্ত, আমি এই তথ্য পেতে কিভাবে নিশ্চিত নই।


আপনি ক্লাসের __name__ বৈশিষ্ট্যটি চেষ্টা করেছেন? অর্থাৎ type(x).__name__ আপনাকে ক্লাসের নাম দেবে যা আমি মনে করি যা আপনি চান।

>>> import itertools
>>> x = itertools.count(0)
>>> type(x).__name__
'count'

এই পদ্ধতি শুধুমাত্র নতুন শৈলী ক্লাস সঙ্গে কাজ করে। আপনার কোড কিছু পুরানো শৈলী ক্লাস ব্যবহার করতে পারে। নিম্নলিখিত উভয় জন্য কাজ করে:

x.__class__.__name__

বিকল্পভাবে আপনি classmethod সজ্জা ব্যবহার করতে পারেন:

class A:
    @classmethod
    def get_classname(cls):
        return cls.__name__

    def use_classname(self):
        return self.get_classname()

ব্যবহার :

>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'

বিশেষ __name__ বৈশিষ্ট্যটি হ্রাস করার পাশাপাশি, আপনি নিজেকে প্রদত্ত ক্লাস / ফাংশনের জন্য যোগ্য নামটির সন্ধান করতে পারেন। এই ধরনের __qualname__ grabbing দ্বারা সম্পন্ন করা হয়।

বেশিরভাগ ক্ষেত্রেই, এগুলি একই রকম হবে, তবে যখন নেস্টেড ক্লাস / পদ্ধতিগুলির সাথে আচরণ করা হয় তখন আপনি যা আউটপুট পাবেন তাতে আলাদা। উদাহরণ স্বরূপ:

class Spam:
    def meth(self):
        pass
    class Bar:
        pass

>>> s = Spam()
>>> type(s).__name__ 
'Spam'
>>> type(s).__qualname__
'Spam'
>>> type(s).Bar.__name__       # type not needed here
'Bar'
>>> type(s).Bar.__qualname__   # type not needed here 
'Spam.Bar'
>>> type(s).meth.__name__
'meth'
>>> type(s).meth.__qualname__
'Spam.meth'

যেহেতু অন্তর্নিহিতকরণ আপনি পরে যাচ্ছেন তা থেকে, এটি সর্বদা আপনি বিবেচনা করতে চাইতে পারেন।


class A:
  pass

a = A()
str(a.__class__)

উপরের নমুনা কোডটি (ইন্টারেক্টিভ ইন্টারপ্রেটারে ইনপুট) '__main__.A' তৈরি করবে যা '__main__.A' বিপরীতে তৈরি হবে, যদি __name__ বৈশিষ্ট্যটি প্রয়োগ করা হয়। শুধুমাত্র A.__class__ এর ফলাফলটি পাস করে str A.__class__ জন্য A.__class__ পরিচালনা করা হয়। যাইহোক, যদি আপনি আরো স্পষ্ট কিছু চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

"{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)

পৃথক মডিউলগুলিতে সংজ্ঞায়িত একই নামের সাথে ক্লাস থাকলে এই আচরণটি আরও ভাল হতে পারে।

উপরে দেওয়া নমুনা কোড Python 2.7.5 পরীক্ষা করা হয়।


type(instance).__name__ != instance.__class__.__name  #if class A is defined like
class A():
   ...

type(instance) == instance.__class__                  #if class A is defined like
class A(object):
  ...

উদাহরণ:

>>> class aclass(object):
...   pass
...
>>> a = aclass()
>>> type(a)
<class '__main__.aclass'>
>>> a.__class__
<class '__main__.aclass'>
>>>
>>> type(a).__name__
'aclass'
>>>
>>> a.__class__.__name__
'aclass'
>>>


>>> class bclass():
...   pass
...
>>> b = bclass()
>>>
>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.bclass at 0xb765047c>
>>> type(b).__name__
'instance'
>>>
>>> b.__class__.__name__
'bclass'
>>>






python-datamodel