SORU
17 Ocak 2009, CUMARTESİ


Python Java Sınıfı bir eşdeğer var mı.() forName?

Python string bir değişken alır ve bu sınıfın bir nesne dize adlı oluşturmak için ihtiyaç var. Java, Class.forName().newInstance() kullanırdım. Python içinde bir karşılığı var mıdır?


Cevaplar için teşekkürler. Ne yaptığımı bilmek isteyenler cevap: komut satırı sınıf adı argüman olarak kullanmak, ve bunu oluşturmak istiyorum. Aslında Jython programlama ve Java dersleri, Java soru-ness dolayısıyla başlatmasını ediyorum. getattr() harika çalışıyor. Çok teşekkürler.

CEVAP
17 Ocak 2009, CUMARTESİ


Python yansıma Java olduğundan çok daha kolay ve çok daha esnektir.

tutorial Bu okumanızı tavsiye ederiz

Yok direkt fonksiyon (bildiğim kadarıyla) de bir tam olarak nitelenmiş sınıf adını döndürür sınıfı, ancak tüm parçaları bir ihtiyaç için inşa ve onları bir araya bağlamak.

Ama bir tavsiye: bir bit python. Java tarzı program için çalışmıyorsun

Eğer yapmaya çalıştığın şey ne anlatsan, belki de bunu yapmanın daha pythonic bir yol bulmanıza yardımcı olabilir.

Burada istediğiniz özellikleri içeren bir fonksiyonu

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

Eğer sınıfın kendisi sanki bu işlevin dönüş değeri kullanabilirsiniz.

İşte kullanımı bir örnek:

>>> 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)
>>> 

Nasıl çalışır?

__import__ biz ilk tam adı modül adı ayıklamak için gerekli olan Sınıf, tutan modülünü almak için kullanıyoruz. Sonra modül alma:

m = __import__( module )

Bu durumda, m sadece üst düzey modülüne bakın

Eğer sınıf foo.baz modül içinde yaşarsa, örneğin, daha sonra m 15* *modülü olacak
Kolayca foo.baz başvuru getattr( m, 'baz' ) kullanarak alabiliriz

Sınıfı için üst düzey modülünden almak için, özyinelemeli olarak sınıf adı parçaları gettatr kullanın

Eğer sınıf adı foo.baz.bar.Model değilse örneğin, o zaman bir tek

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

Bu döngü içinde neler oluyor

for comp in parts[1:]:
    m = getattr(m, comp)    

Döngünün sonunda, m olacak sınıf için bir referans. Bu m örneğin yapabilirsin aslında sınıf itslef olduğu anlamına gelir:

a = m() #instantiate a new instance of the class    
b = m( arg1, arg2 ) # pass arguments to the constructor

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Call Me Howard

    Call Me Howa

    18 AĞUSTOS 2012
  • Julian Smith

    Julian Smith

    31 EKİM 2006
  • TheGamer2323

    TheGamer2323

    25 Ocak 2009