Jika Anda benar-benar ingin mengambil kelas yang Anda buat dengan string, Anda harus menyimpan (atau menggunakan kata yang tepat, referensi ) dalam kamus. Setelah semua, itu juga akan memungkinkan untuk memberi nama kelas Anda di tingkat yang lebih tinggi dan menghindari mengekspos kelas yang tidak diinginkan.
Contoh, dari game di mana kelas aktor didefinisikan dengan Python dan Anda ingin menghindari kelas umum lainnya yang bisa dijangkau oleh input pengguna.
Pendekatan lain (seperti dalam contoh di bawah) akan membuat seluruh kelas baru, yang memegang di dictatas. Ini akan:
- Izinkan beberapa pemegang kelas dibuat untuk organisasi yang lebih mudah (seperti, satu untuk kelas aktor dan satu lagi untuk jenis suara);
- Buat modifikasi untuk pemegang dan kelas yang diadakan lebih mudah;
- Dan Anda dapat menggunakan metode kelas untuk menambahkan kelas ke dikt. (Meskipun abstraksi di bawah ini tidak benar-benar diperlukan, itu hanya untuk ... "ilustrasi" ).
Contoh:
class ClassHolder(object):
def __init__(self):
self.classes = {}
def add_class(self, c):
self.classes[c.__name__] = c
def __getitem__(self, n):
return self.classes[n]
class Foo(object):
def __init__(self):
self.a = 0
def bar(self):
return self.a + 1
class Spam(Foo):
def __init__(self):
self.a = 2
def bar(self):
return self.a + 4
class SomethingDifferent(object):
def __init__(self):
self.a = "Hello"
def add_world(self):
self.a += " World"
def add_word(self, w):
self.a += " " + w
def finish(self):
self.a += "!"
return self.a
aclasses = ClassHolder()
dclasses = ClassHolder()
aclasses.add_class(Foo)
aclasses.add_class(Spam)
dclasses.add_class(SomethingDifferent)
print aclasses
print dclasses
print "======="
print "o"
print aclasses["Foo"]
print aclasses["Spam"]
print "o"
print dclasses["SomethingDifferent"]
print "======="
g = dclasses["SomethingDifferent"]()
g.add_world()
print g.finish()
print "======="
s = []
s.append(aclasses["Foo"]())
s.append(aclasses["Spam"]())
for a in s:
print a.a
print a.bar()
print "--"
print "Done experiment!"
Ini mengembalikan saya:
<__main__.ClassHolder object at 0x02D9EEF0>
<__main__.ClassHolder object at 0x02D9EF30>
=======
o
<class '__main__.Foo'>
<class '__main__.Spam'>
o
<class '__main__.SomethingDifferent'>
=======
Hello World!
=======
0
1
--
2
6
--
Done experiment!
Eksperimen menyenangkan lain yang harus dilakukan dengan itu adalah menambahkan metode yang mengasamkan ClassHoldersehingga Anda tidak pernah kehilangan semua kelas yang Anda lakukan: ^)