Python'da yansıtma, Java'dakinden çok daha kolay ve çok daha esnektir.
Bu öğreticiyi okumanızı tavsiye ederim
Tam nitelikli bir sınıf adını alan ve sınıfı döndüren doğrudan bir işlev (bildiğim kadarıyla) yoktur, ancak bunu oluşturmak için gereken tüm parçalara sahipsiniz ve bunları birbirine bağlayabilirsiniz.
Yine de bir parça tavsiye: python'dayken Java tarzında programlamaya çalışmayın.
Yapmaya çalıştığınız şeyin ne olduğunu açıklayabilirseniz, belki bunu yapmanın daha pitonik bir yolunu bulmanıza yardımcı olabiliriz.
İşte istediğinizi yapan bir işlev:
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
Bu işlevin dönüş değerini, sanki sınıfın kendisiymiş gibi kullanabilirsiniz.
İşte bir kullanım örneği:
>>> 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)
>>>
Bu nasıl çalışıyor?
__import__
Sınıfı tutan modülü içe aktarmak için kullanıyoruz , bu da öncelikle modül adını tam nitelikli addan çıkarmamızı gerektiriyor. Ardından modülü içe aktarıyoruz:
m = __import__( module )
Bu durumda, m
yalnızca üst düzey modüle atıfta bulunulacaktır,
Örneğin, sınıf içinde yaşıyorsa foo.baz
modülü, daha sonra m
modül olacak foo
Biz kolayca bir referans elde edebilirsiniz foo.baz
kullanarakgetattr( m, 'baz' )
En üst düzey modülden sınıfa geçmek için gettatr
, sınıf adının bölümlerinde yinelemeli olarak kullanmanız gerekir
Örneğin, sınıf adınız ise foo.baz.bar.Model
şunu yapalım:
m = __import__( "foo.baz.bar" )
m = getattr( m, "baz" )
m = getattr( m, "bar" )
m = getattr( m, "Model" )
Bu döngüde olan şey şu:
for comp in parts[1:]:
m = getattr(m, comp)
Döngünün sonunda m
, sınıfa bir referans olacaktır. Bu m
, aslında itslef sınıfı olduğu anlamına gelir, örneğin şunları yapabilirsiniz:
a = m() #instantiate a new instance of the class
b = m( arg1, arg2 ) # pass arguments to the constructor
importlib.import
2,7 (üzere piton 3'ten backported edildi docs.python.org/2/library/importlib.html )