เมื่อได้รับสตริงเป็นอินพุตจากผู้ใช้ และต้องการแปลงเป็นออบเจ็กต์คลาส หากมีคลาสชื่อนั้นอยู่ในเนมสเปซปัจจุบัน สามารถทำได้ 2 วิธีหลัก
วิธีที่ 1: ใช้ eval()
class Foobar:
pass
print(eval("Foobar"))
print(type(Foobar))
ผลลัพธ์
__main__.Foobar <type 'classobj'>
วิธีที่ 2: ใช้ getattr() กับ sys.modules
import sys
class Foobar:
pass
def str_to_class(class_name):
return getattr(sys.modules[__name__], class_name)
print(str_to_class("Foobar"))
print(type(Foobar))
ผลลัพธ์
__main__.Foobar <type 'classobj'>
วิธีที่ 2 ปลอดภัยกว่า eval() เนื่องจากไม่ได้รันโค้ดโดยตรง