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, m
sẽ 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.baz
mô-đun, thì m
sẽ là mô-đun. foo
Chúng tôi có thể dễ dàng lấy tham chiếu để foo.baz
sử 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.Model
thì 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, m
sẽ là một tham chiếu đến lớp. Điều này có nghĩa là nó m
thự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 )