2017-03-26 16 views
0

私はPythonフラスコのチュートリアルに従っています。私はそうのようなconfig.pyを持っている:initオブジェクトを含むPython辞書

import os 
basedir = os.path.abspath(os.path.dirname(__file__)) 


class Config(): 
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'DDFHSJ734H927YF9843' 
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True 
    SQLALCHEMY_TRACK_MODIFICATIONS = False 
    MAIL_SERVER = 'smtp.googlemail.com' 
    MAIL_PORT = 587 
    MAIL_USE_TLS = True 
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME') 
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD') 
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]' 
    FLASKY_MAIL_SENDER = 'Flasky Admin <[email protected]>' 
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN') 

    # Implement this later 
    @staticmethod 
    def init_app(app): 
     pass 


class DevelopmentConfig(Config): 
    DEBUG = True 
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \ 
     'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite') 


class TestingConfig(Config): 
    TESTING = True 
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \ 
     'sqlite:///' + os.path.join(basedir, 'data-test.sqlite') 


class ProductionConfig(Config): 
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ 
     'sqlite:///' + os.path.join(basedir, 'data.sqlite') 


config = { 
    'development': DevelopmentConfig, 
    'testing': TestingConfig, 
    'production': ProductionConfig, 

    'default': DevelopmentConfig 
} 

私は一番下に設定辞書について混乱しています。たとえば、'development': DevelopmentConfigは初期化されたDevelopmentConfigオブジェクトを指していますか?なぜそれは'development': DevelopmentConfig()ではないですか?また、なぜobjectがベースConfigクラスの引数から省略されているのですか?

答えて

2

例えば、'development': DevelopmentConfigは、初期化されたDevelopmentConfigオブジェクトを指していますか?

いいえ、これはDevelopmentConfigクラスへの参照を保持しています。

なぜですか?'development': DevelopmentConfig()です。

これは、クラスをインスタンス化するのに適切な場所ではない可能性があるためです。 Moresoクラスのうちの1つだけがバグを引き起こすことなく実際にインスタンス化できる場合。

はまた、なぜobjectは基本Configクラス内の引数から省略されましたか?

純粋にオプションです。 Python 2.6以降では、新しいスタイルのクラスの代わりに古いスタイルのクラスを作成します。Python 3.xでは、それは何の違いもありません(空のスーパークラス指定子は2.5より古い構文が無効であることに注意してください)完全に)。

3

Pythonでは、クラスはオブジェクトです。したがって、その辞書内のdevelopmentキーの値は、クラスDevelopmentConfigです。こうすれば、config['development']()と呼び出すことができます。初期化されたDeveloptmentConfigオブジェクトがあります。 objectは省略されていますが、Python 3では、新しいクラスに与えられた親クラスがない場合、自動的にサブクラスobjectになります。

関連する問題