Gerçekten bir dize ile yapmak sınıfları almak istiyorsanız, saklamalısınız (veya düzgün, ifadeli referans ) bir sözlükte onları. Sonuçta, bu aynı zamanda sınıflarınızı daha yüksek bir seviyede adlandırmanıza ve istenmeyen sınıfları açığa çıkarmanıza izin vermez.
Örneğin, Python'da aktör sınıflarının tanımlandığı ve diğer genel sınıfların kullanıcı girdisi tarafından erişilmesini önlemek istediğiniz bir oyundan.
Başka bir yaklaşım (aşağıdaki örnekte olduğu gibi), dictyukarıdakileri içeren tamamen yeni bir sınıf yapmak olacaktır . Bu:
- Daha kolay düzenleme için birden fazla sınıf sahibinin oluşturulmasına izin verin (biri aktör sınıfları için diğeri ses türleri için);
- Hem tutucu hem de tutulan sınıflarda değişiklikler yapın;
- Ve dikteye sınıf eklemek için sınıf yöntemlerini kullanabilirsiniz. (Aşağıdaki soyutlama gerçekten gerekli olmasa da, sadece ... "gösterim" içindir ).
Misal:
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!"
Bu beni döndürür:
<__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!
Bunlarla yapılacak bir başka eğlenceli deney, turşu yapan bir yöntem eklemektir, ClassHolderböylece yaptığınız tüm sınıfları asla kaybetmezsiniz: ^)