2017-10-31 6 views
1

PHPでは、通常、依存関係をコンストラクタに渡します。依存関係を管理するPythonの方法

<?php 

class Downloader 
{ 
    public function __construct(LoggerInterface $logger){} 

} 

しかし、Pythonで(私は初心者です)のような

は、私たちはクラスのスコープの外で定義されたオブジェクトを直接使用することができます使用することができます参照してください。

logger = logging.getLogger('mylogger') 

class Downloader(): 
    def download(): 
     logger.alert('I am downloading..') 

私は、Python開発者がクラス内のサービスをどのように使用するかの推奨を理解したいと思います。私はそれがグローバルスコープにあることに依存しないでしょう

+1

何かのように引数として依存関係を渡すことであろうあなたが必ず注入したくないロガーPHPで 'error_log( 'Foo!')'と同じです。この点で、OOPの実践は実際には違いはありません。 – deceze

+1

これは、 'logger'がDownloader()のビューから' global'であるためです。クラス__init __()関数に依存関係を渡すこともできます。 – nauer

答えて

1

まあ作ると思いますいずれか、それが依存しています。私は、ファイルやモジュール内のすべてのクラスに共通する、変異されないものがある場合、コンストラクタに渡さずに直接使用する傾向があります。それ以外の場合は、クラスレベルで変数を定義します。継承されたクラスでそれを変更したい場合

ダウンローダクラス(およびそれを継承するすべての人)が常に同じロガーを使用する場合は、今使っているように使っても問題ありません。私の場合は

# Case 1 
# In case you want to allow logger being different for inherited classes. 

class BaseDownloader(object): 

     logger = Logger1 

class Downloader1(BaseDownloader): 

     logger = Logger2 

# Case 2 
# In case you want different logger for every instance 

class Downloader(object): 

     def __init__(self, logger): 
      self.logger = logger 

# Case 3 
# If you don't need that kind of customizability, then using it directly 
# is perfectly fine. In fact, that's how I'd start with, and change it 
# later if the need arises. 

class Downloader(object): 

     def download(): 
      logger.alert('I am downloading') 
+1

だから私はここでは、必要な対ベストプラクティスの誇大宣伝 –

1

が、私はそれクラスレベルのメンバー

class Downloader(): 
    logger = logging.getLogger('mylogger') 

    def download(self): 
     logger.alert('I am downloading..') 

またはインスタンス・レベルのメンバー

class Downloader(): 
    def __init__(self): 
     self.logger = logging.getLogger('mylogger') 

    def download(self): 
     self.logger.alert('I am downloading..') 
+0

これは本当に大きな違いはありません。あなたがモジュールのスコープに書いているのであれば、そこにあることに完全に依存することができます。 – deceze

1

、私はクラス自体で唯一のインスタンスの依存関係に好き

class Downloader(): 
    logger = logging.getLogger('mylogger') 
    def download(): 
     logger.alert('I am downloading..') 

別のオプションは、クラス作成

logger = logging.getLogger('mylogger') 

class Downloader(): 
    def __init__(self, logger): 
     self.logger = logger 
    def download(): 
     logger.alert('I am downloading..') 

downloader = Download(logger)