2011-07-28 21 views
36

Şu anda os, stat ve diğer bazı gereksinimlere sahip bir sınıf yazıyorum.Python sınıfı içindeki modülleri içe aktarma

Bu modülleri sınıfımda içe aktarmanın en iyi yolu nedir?

Başkalarının ne zaman kullanacağını düşünüyorum, sınıf bağımlı olduğunda 'bağımlılık' modüllerinin zaten olmasını istiyorum.

Artık bunları yöntemlerimde içe aktarıyorum, ancak belki de daha iyi bir çözüm var.

cevap

33

Modülünüz her zaman başka bir modül alırsa, her zaman en üstte PEP 8 olarak belirtin ve diğer yanıtlar belirtin. Ayrıca, @delnan bir yorumda belirtildiği gibi, sys, os, vb. Yine de kullanılıyor, bu yüzden onları küresel olarak almak zarar vermez. Ancak, belirli çalışma zamanı koşullarında gerçekten yalnızca bir modüle gereksinim duyarsanız, koşullu içe aktarmalarda yanlış bir şey yoktur.

sadece sınıf sınıf bir koşullu blok veya başka sınıf veya yöntemde ise, böyle bir şey yapabileceği gibi , tanımlanmış ise içe isterseniz: Eğer

condition = True 

if condition: 
    class C(object): 
     os = __import__('os') 
     def __init__(self): 
      print self.os.listdir 

    C.os 
    c = C() 

Sadece sınıfın örneğiyle içe aktarılmasını istiyorsanız bunu __new__ veya __init__'da yapın.

+6

Bir yöntemi bir yöntemde ('__init__' gibi) alırsam, birden çok örnek oluşturursam bu modülü birden çok kez içe aktarmaz mı? Bu nedenle, küresel olarak ithal edilmesine kıyasla, performansı etkiler mi? –

+1

__import'un ardından değil(), []? Köşeleri kullandığımda "TypeError: 'builtin_function_or_method' nesnesinin '__getitem__' özniteliği yok" hatasını alıyorum. Bunu değiştirdikten sonra() çalışır, ama ithal modülünü sınıfın adıyla öneklemek zorundayım, hatta sınıfın içinde içe aktarılan modülü kullanırken bile bunu yapmamayı tercih ederim. Bunun herhangi bir yolu var mı? – Samuel

+2

@Samuel: Düzeltme için teşekkürler, ithalatı düzelttim. İçe aktarılan nesnenin global olarak kullanılabilir olmasını istiyorsanız, sadece normal 'import' ifadesini kullanın. Şartlı içe aktarmalarla gerçekten iyi bir fikir değildir, çünkü dışarıdan kodla * dışarıda *, yalnızca şartlı olarak içe aktarmanın ilk dalı yürütüldüğünde işe yarayan koşullara sahip olabilirsiniz.Yukarıdaki gibi __import__ kullanırsanız, nesne için genel bir ad oluşturmaktan kaçınırsınız. – agf

0

This ("Imports" bölümündeki) resmi kağıt durumları, normal olarak import s kaynak dosyanızın en üstüne yerleştirilmelidir. Özel durumlardan ayrı olarak bu kurala uymaktayım. ithalatta

8

PEP 8:

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

Bu el altında dosya tarafından kullanılan tüm modülleri görmek için kolaylaştırır ve bir modül birden fazla yerde kullanıldığında çeşitli yerlerde ithalat çoğaltmak zorunda kalınmaz . Diğer her şey (örneğin, işlev/yöntem düzeyinde içe aktarmalar) mutlak bir istisna olmalı ve iyi bir şekilde gerekçelendirilmelidir.

+10

Bu, __unconditional imports__ içindir. Eğer sadece bu sınıfın örneklenmesi durumunda onları ithal etmek istiyorsanız, bu kesinlikle geçerli değildir. – agf

+0

@agf: Şartlı olarak içe aktarmanın nadiren bir nedeni var. Özellikle OP modülleri kullanıldığında, bunlar muhtemelen uygulama tarafından kullanılmakta (python -c "import sys; print sys.modules.keys()" '). – delnan

5
import sys 
from importlib import import_module 

class Foo(): 

    def __init__(self): 

     if self.condition: 
      self.importedModule = import_module('moduleName') 

     if 'moduleName' in sys.modules: 
      self.importedModule.callFunction(params) 

     #or 

     if self.condition: 
      self.importedModule.callFunction(params) 
İlgili konular