Pertanyaan Bagaimana cara menetapkan nama kelas secara dinamis?


Saya memiliki fungsi yang menciptakan kelas yang berasal dari argumennya:

def factory(BaseClass) :
    class NewClass(BaseClass) : pass
    return NewClass

Sekarang ketika saya menggunakannya untuk membuat kelas baru, kelas semua dinamai sama, dan contoh terlihat seperti mereka memiliki tipe yang sama:

NewA = factory(ClassA)
NewB = factory(ClassB)
print type(NewA()) # <class __main__.NewClass>
print type(NewB()) # <class __main__.NewClass>

Apakah perbaikan yang tepat untuk mengatur secara manual __name__ atribut?

NewA.__name__ = 'NewA'
print type(NewA()) # <class __main__.NewA>

Apakah ada hal lain yang harus saya tetapkan saat saya berada di sana?


32
2018-03-18 13:39


asal


Jawaban:


Ya, pengaturan __name__ adalah hal yang benar untuk dilakukan; Anda tidak perlu mengatur hal lain untuk menyesuaikan nama kelas.

Sebagai contoh:

def factory(BaseClass) :
    class NewClass(BaseClass): pass
    NewClass.__name__ = "factory_%s" % BaseClass.__name__
    return NewClass

type adalah salah hal yang digunakan di sini. Ini tidak membiarkan Anda mendefinisikan kelas dengan sintaks kelas normal Python, bukannya membuat Anda mengatur setiap atribut kelas secara manual. Ini digunakan untuk membuat kelas dengan tangan, misalnya. jika Anda memiliki larik kelas dasar dan Anda ingin membuat kelas yang menggunakannya (yang tidak dapat Anda lakukan dengan sintaks kelas Python). Jangan gunakan di sini.


37
2018-03-18 14:43



Lihat menggunakan type() berfungsi dengan tiga argumen. Kode berikut membuat kelas baru "NewA", dengan object sebagai tipe dasar, dan tidak ada atribut awal.

>>> type('NewA', (object,), {})
<class '__main__.NewA'>

10
2018-03-18 13:48