Nếu bạn thực sự muốn truy xuất các lớp bạn tạo bằng một chuỗi, bạn nên lưu trữ (hoặc từ đúng, tham chiếu ) chúng trong từ điển. Rốt cuộc, điều đó cũng sẽ cho phép đặt tên các lớp của bạn ở cấp độ cao hơn và tránh để lộ các lớp không mong muốn.
Ví dụ, từ một trò chơi trong đó các lớp diễn viên được xác định bằng Python và bạn muốn tránh các lớp chung khác được tiếp cận bởi đầu vào của người dùng.
Một cách tiếp cận khác (như trong ví dụ dưới đây) sẽ tạo ra một lớp hoàn toàn mới, giữ nguyên dict
ở trên. Cái này sẽ:
- Cho phép nhiều chủ sở hữu lớp được thực hiện để tổ chức dễ dàng hơn (như, một cho các lớp diễn viên và một cho các loại âm thanh);
- Thực hiện sửa đổi cho cả chủ sở hữu và các lớp được tổ chức dễ dàng hơn;
- Và bạn có thể sử dụng các phương thức lớp để thêm các lớp vào dict. (Mặc dù sự trừu tượng dưới đây không thực sự cần thiết, nó chỉ đơn thuần là để ... "minh họa" ).
Thí dụ:
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!"
Điều này trả lại cho tôi:
<__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!
Một thử nghiệm thú vị khác để thực hiện với những phương pháp đó là thêm một phương thức dưa chua ClassHolder
để bạn không bao giờ mất tất cả các lớp bạn đã làm: ^)