Phản chiếu trong python dễ dàng và linh hoạt hơn rất nhiều so với trong Java.
Tôi khuyên bạn nên đọc hướng dẫn này
Không có hàm trực tiếp nào (mà tôi biết) lấy tên lớp đủ điều kiện và trả về lớp, tuy nhiên bạn có tất cả các phần cần thiết để xây dựng nó và bạn có thể kết nối chúng với nhau.
Tuy nhiên, có một lời khuyên: đừng cố gắng lập trình theo kiểu Java khi bạn đang ở trong python.
Nếu bạn có thể giải thích những gì bạn đang cố gắng làm, có thể chúng tôi có thể giúp bạn tìm ra cách làm điều đó hiệu quả hơn.
Đây là một chức năng thực hiện những gì bạn muốn:
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
Bạn có thể sử dụng giá trị trả về của hàm này như thể nó là chính lớp.
Đây là một ví dụ sử dụng:
>>> 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)
>>>
Nó hoạt động như thế nào?
Chúng tôi đang sử dụng __import__để nhập mô-đun chứa lớp, điều này yêu cầu trước tiên chúng tôi trích xuất tên mô-đun từ tên đủ điều kiện. Sau đó, chúng tôi nhập mô-đun:
m = __import__( module )
Trong trường hợp này, msẽ chỉ tham chiếu đến mô-đun cấp cao nhất,
Ví dụ: nếu lớp của bạn nằm trong foo.bazmô-đun, thì msẽ là mô-đun. foo
Chúng tôi có thể dễ dàng lấy tham chiếu để foo.bazsử dụnggetattr( m, 'baz' )
Để chuyển từ mô-đun cấp cao nhất đến lớp, phải sử dụng đệ quy gettatr trên các phần của tên lớp
Ví dụ: nếu tên lớp của bạn là foo.baz.bar.Modelthì chúng tôi thực hiện điều này:
m = __import__( "foo.baz.bar" ) #m is package foo
m = getattr( m, "baz" ) #m is package baz
m = getattr( m, "bar" ) #m is module bar
m = getattr( m, "Model" ) #m is class Model
Đây là những gì đang xảy ra trong vòng lặp này:
for comp in parts[1:]:
m = getattr(m, comp)
Ở cuối vòng lặp, msẽ là một tham chiếu đến lớp. Điều này có nghĩa là nó mthực sự là lớp itslef, bạn có thể làm như sau:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import, được báo cáo ngược từ python 3 đến 2.7 ( docs.python.org/2/library/importlib.html )