Pertanyaan Mendapatkan nama kelas instance dengan Python


Bagaimana cara mengetahui nama kelas yang membuat instance objek dalam Python jika fungsi yang saya kerjakan dari ini adalah kelas dasar yang kelas turunannya telah diturunkan?

Berpikir mungkin modul pemeriksaan mungkin telah membantu saya di sini, tetapi tampaknya itu tidak memberi saya apa yang saya inginkan. Dan singkat dari parsing __class__ anggota, saya tidak yakin bagaimana cara mendapatkan informasi ini.


997
2018-02-04 11:37


asal


Jawaban:


Sudahkah Anda mencoba __name__ atribut kelas? yaitu type(x).__name__ akan memberi Anda nama kelas, yang saya pikir adalah apa yang Anda inginkan.

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

Metode ini berfungsi dengan kelas gaya baru hanya. Kode Anda mungkin menggunakan beberapa kelas gaya lama. Berikut ini berfungsi untuk keduanya:

x.__class__.__name__

1340
2018-02-04 12:02



Apakah Anda ingin nama kelas sebagai string?

instance.__class__.__name__

280
2018-02-04 12:02



ketik ()?

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

70
2018-02-04 11:42



class A:
  pass

a = A()
str(a.__class__)

Kode contoh di atas (ketika input dalam interpreter interaktif) akan dihasilkan '__main__.A' sebagai lawan 'A' yang dihasilkan jika __name__ atribut dipanggil. Dengan hanya melewatkan hasil A.__class__ ke str konstruktor parsing ditangani untuk Anda. Namun, Anda juga dapat menggunakan kode berikut jika Anda menginginkan sesuatu yang lebih eksplisit.

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

Perilaku ini dapat lebih disukai jika Anda memiliki kelas dengan nama yang sama yang didefinisikan dalam modul terpisah.

Kode contoh yang disediakan di atas diuji dengan Python 2.7.5.


25
2018-06-09 23:04



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):
  ...

Contoh:

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

24
2018-04-30 05:50



Pertanyaan bagus.

Berikut contoh sederhana berdasarkan GHZ yang mungkin membantu seseorang:

>>> 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
2018-02-21 19:07



Terlepas dari meraih yang spesial __name__ atribut, Anda mungkin menemukan diri Anda membutuhkan nama yang memenuhi syarat untuk kelas / fungsi tertentu. Ini dilakukan dengan mengambil jenis __qualname__.

Dalam kebanyakan kasus, ini akan persis sama, tetapi, ketika berhadapan dengan kelas / metode bersarang ini berbeda dalam output yang Anda dapatkan. Sebagai contoh:

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'

Karena introspeksi adalah apa yang Anda cari, ini selalu bisa Anda pertimbangkan.


4
2017-07-12 15:01



Atau Anda dapat menggunakan classmethod penghias:

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

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

Pemakaian:

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

4
2017-09-13 19:11