উদাহরণের ক্লাসের নাম পাচ্ছেন?


1435

আমি যে ক্লাসটির দ্বারা পাইথনের কোনও অবজেক্টের উদাহরণ তৈরি করেছি সেটির নাম কীভাবে খুঁজে পাব যদি আমি যে ফাংশনটি থেকে এই কাজটি করছি তা উদাহরণ শ্রেণীর উত্সটি পেয়েছে?

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


আপনি ক্লাস ভেরিয়েবল থেকে ঠিক কী 'পার্সিং' করছেন ?
সিকোড়া

1
উদাহরণটি সম্পর্কিত শ্রেণীর শীর্ষ স্তরের নাম (মডিউল নাম, ইত্যাদি ছাড়া ...)
ড্যান

আমি মনে করি বিপরীতটি আরও শক্ত হবে (ক্লাসটি পাওয়ার জন্য যেখানে পদ্ধতি / ফাংশনটি সংজ্ঞায়িত করা হয়েছে)।
আলেক্সি

উত্তর:


1905

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

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

আপনি যদি এখনও পাইথন 2 ব্যবহার করে থাকেন তবে মনে রাখবেন যে উপরের পদ্ধতিটি কেবলমাত্র নতুন-স্টাইলের ক্লাসগুলির সাথে কাজ করে (পাইথন 3+ তে সমস্ত ক্লাসগুলি "নতুন-স্টাইল" শ্রেণি রয়েছে)। আপনার কোড কিছু পুরানো শৈলী ক্লাস ব্যবহার করতে পারে। নিম্নলিখিত উভয় জন্য কাজ করে:

x.__class__.__name__

40
আশ্চর্যজনকভাবে সহজ। ভাবছেন কেন dir(x.__class__)এটি তালিকা করে না?
সিএফআই

43
পদ্ধতিটি কেন ব্যবহার __class__করবেন type? যেমন: type(x).__name__। ডাবল আন্ডারস্কোর সদস্যদের সরাসরি কল করা কি নিরুৎসাহিত হচ্ছে না? __name__যদিও আমি ব্যবহার করার আশেপাশে কোনও রাস্তা দেখতে পাচ্ছি না ।
jpmc26

25
__class__পুরানো স্টাইলের ক্লাসগুলির সাথে সামঞ্জস্য রাখতে আপনাকে সরাসরি ব্যবহার করতে হবে, কারণ এগুলির ধরণটি ন্যায়সঙ্গত instance
কোয়ান্টাম

14
লগিং, orm এবং ফ্রেমওয়ার্ক কোডে এটি প্রায়শই যথেষ্ট ব্যবহৃত হয় যে সত্যই একটি বিল্টিন টাইপনেম (এক্স) হওয়া উচিত ... একটি নাম পাওয়ার জন্য কোনও ব্যবহারকারীকে "সাহস" দেখতে প্রয়োজন , আইএমও ভয়ঙ্করভাবে পাইথোনিক নয়।
এরিক অ্যারোনস্টি

5
@ এরিক অ্যারোনাস্টি,def typename(x): return type(x).__name__

388

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

instance.__class__.__name__

6
বা উদাহরণস্বরূপ। ক্লাস__ শ্রেণীর অবজেক্টটি পেতে: ডি
পেনসিলচেক

8
ডাবল আন্ডারস্কোর বৈশিষ্ট্য ব্যবহার করা কি নিরাপদ?
এডুয়ার্ড লুকা

5
@ এদুয়ার্ডলুকা এটি নিরাপদ হবে না কেন? অন্তর্নির্মিত বৈশিষ্ট্যগুলি আন্ডারস্কোরগুলি ব্যবহার করে যাতে তারা আপনার লিখিত কোডের সাথে কোনও বিরোধ না সৃষ্টি করে
জেসি রোকামন্ডে

3
আমি জানি যে একক আন্ডারস্কোরগুলি বোঝায় / প্রস্তাব দেয় যে পদ্ধতি / সম্পত্তিটি ব্যক্তিগত হওয়া উচিত (যদিও আপনি পাইথন এএফএইচিতে প্রকৃতপক্ষে ব্যক্তিগত পদ্ধতিগুলি বাস্তবায়ন করতে পারবেন না), এবং আমি ভাবছিলাম যে এটিও (কিছু) ডাবল আন্ডারস্কোরগুলির ক্ষেত্রে না হয়।
এডুয়ার্ড লুকা

28
@ এডওয়ার্ড লুকা শুরুতে ডাবল আন্ডারস্কোরগুলি কেবল শুরুতে একক আন্ডারস্কোরের মতো, তবে আরও "বেসরকারী" ("পাইথনের নাম ম্যাঙ্গলিং" দেখুন)। শুরুতে এবং শেষে ডাবল আন্ডারস্কোরগুলি পৃথক - সেগুলি পাইথনের জন্য সংরক্ষিত এবং ব্যক্তিগত নয় (যেমন __init__ এবং __add__ এর মতো যাদু পদ্ধতি)।
লিগসাইদ গর্ডন

99

টাইপ ()?

>>> class A(object):
...    def whoami(self):
...       print type(self).__name__
...
>>>
>>> class B(A):
...    pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>

এটি ক্লাস মেম্বারের মতোই , তবে আমাকে এই ফলাফলটি হাতছাড়া করতে হবে যা কিছুটা বিরক্তিকর ...
ড্যান

8
আমার এটা ভাল লেগেছে. এইভাবে উপক্লাসের নাম পাওয়া কোনও বেস ক্লাসে সম্ভব।
জোকি

6
বা self.__class__.__name__পরিবর্তে type(self).__name__একই আচরণ পেতে। কিছু না থাকলে type()ফাংশনটি কি আমি অবগত নই?
andreb

2
আপনি যদি type(item)কোনও তালিকা আইটেমে ব্যবহার করছেন তবে ফলাফলটি শ্রেণীর নাম ধারণ করার <type 'instance'>সময় আসবে item.__class__.__name__
গ্রোচনি

1
আমি মনে করি সমস্যাটি হল এই যে @Grochni উল্লেখ পাইথন 2.x নির্দিষ্ট শ্রেণীর শুধু প্রাসঙ্গিক, এখানে দেখুন: stackoverflow.com/questions/6666856/...
Nate সিকে

43
class A:
  pass

a = A()
str(a.__class__)

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

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

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

উপরে প্রদত্ত নমুনা কোডটি পাইথন ২.7.৫ এ পরীক্ষা করা হয়েছিল।


2.6.6 এ পরীক্ষিত। এখনও ভাল কাজ করে।
হ্যামলেট

29
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'
>>>

5
এটি কেবল পুরানো পাইথন ২.x এর ক্ষেত্রে সত্য holds 3.x এ, বিসি ক্লাস () bclass (অবজেক্ট) এ সমাধান করবে। এবং তারপরেও, পাইথন ২.২ এ নতুন ক্লাস উপস্থিত হয়েছিল।
alcalde

16

ভাল প্রশ্ন.

এখানে GHZ এর উপর ভিত্তি করে একটি সাধারণ উদাহরণ যা কারও সাহায্য করতে পারে:

>>> class person(object):
        def init(self,name):
            self.name=name
        def info(self)
            print "My name is {0}, I am a {1}".format(self.name,self.__class__.__name__)
>>> bob = person(name='Robert')
>>> bob.info()
My name is Robert, I am a person

13

বিকল্পভাবে আপনি 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'

10

বিশেষ __name__বৈশিষ্ট্যটি ধরা ছাড়াও , আপনি কোনও নির্দিষ্ট শ্রেণি / ক্রিয়াকলাপের জন্য নিজেকে যোগ্য নামের প্রয়োজনে খুঁজে পেতে পারেন । এটি ধরণগুলি দখল করেই করা হয় __qualname__

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

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'

যেহেতু আত্মপরিচয় আপনার পরে, তাই এটি সর্বদা আপনি বিবেচনা করতে চাইতে পারেন।


2
লক্ষ করা উচিত যে __qualname__পাইথন 3.3+ এর জন্য
ফায়ারএফিস

10
এবং আমি আমার সফ্টওয়্যার "মেথ" এর কোনও নামকরণ এড়াতে চাইতাম।
বোবার্ট

এর জন্য সম্পর্কিত ব্যাখ্যা __qualname__বনাম __name__: stackoverflow.com/questions/58108488/what-is-qualname-in-python
ti7

0

উদাহরণস্বরূপ শ্রেণীর নাম পেতে:

type(instance).__name__

অথবা

instance.__class__.__name__

দুটোই এক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.