การสะท้อนใน python นั้นง่ายกว่าและยืดหยุ่นกว่าใน Java มาก
ขอแนะนำให้อ่านบทแนะนำนี้
ไม่มีฟังก์ชันโดยตรง (ที่ฉันรู้จัก) ซึ่งใช้ชื่อคลาสแบบเต็มและส่งคืนคลาสอย่างไรก็ตามคุณมีทุกส่วนที่จำเป็นในการสร้างสิ่งนั้นและคุณสามารถเชื่อมต่อเข้าด้วยกันได้
คำแนะนำเล็กน้อย: อย่าพยายามเขียนโปรแกรมในรูปแบบ Java เมื่อคุณอยู่ใน python
หากคุณสามารถอธิบายได้ว่าคุณกำลังพยายามทำอะไรอยู่บางทีเราอาจช่วยคุณหาวิธีทำแบบไพ ธ อนิกได้มากขึ้น
นี่คือฟังก์ชันที่ทำในสิ่งที่คุณต้องการ:
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
คุณสามารถใช้ค่าส่งกลับของฟังก์ชันนี้ราวกับว่าเป็นคลาสนั้นเอง
นี่คือตัวอย่างการใช้งาน:
>>> D = get_class("datetime.datetime")
>>> D
<type 'datetime.datetime'>
>>> D.now()
datetime.datetime(2009, 1, 17, 2, 15, 58, 883000)
>>> a = D( 2010, 4, 22 )
>>> a
datetime.datetime(2010, 4, 22, 0, 0)
>>>
ทำงานอย่างไร?
เรากำลังใช้__import__
เพื่ออิมพอร์ตโมดูลที่มีคลาสซึ่งจำเป็นต้องแยกชื่อโมดูลออกจากชื่อแบบเต็มก่อน จากนั้นเรานำเข้าโมดูล:
m = __import__( module )
ในกรณีนี้m
จะอ้างถึงโมดูลระดับบนสุดเท่านั้น
ตัวอย่างเช่นหากชั้นเรียนของคุณอาศัยอยู่ในfoo.baz
โมดูลm
จะเป็นโมดูลที่foo
เราสามารถขอข้อมูลอ้างอิงเพื่อfoo.baz
ใช้getattr( m, 'baz' )
ในการรับจากโมดูลระดับบนสุดไปยังคลาสต้องใช้ซ้ำgettatr
กับส่วนของชื่อคลาส
ยกตัวอย่างเช่นถ้าคุณมีชื่อคลาสfoo.baz.bar.Model
เราจะทำดังนี้
m = __import__( "foo.baz.bar" )
m = getattr( m, "baz" )
m = getattr( m, "bar" )
m = getattr( m, "Model" )
นี่คือสิ่งที่เกิดขึ้นในลูปนี้:
for comp in parts[1:]:
m = getattr(m, comp)
ในตอนท้ายของลูปm
จะเป็นการอ้างอิงถึงคลาส ซึ่งหมายความว่าm
จริงๆแล้วมันเป็นคลาสที่คุณสามารถทำได้เช่น:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
ซึ่ง backported จาก python 3 ถึง 2.7 ( docs.python.org/2/library/importlib.html )