2017-03-26 167 views
0

我正在關注Python瓶的教程。我有一個config.py像這樣:初始化對象的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()

因爲這可能不是實例化類的適當位置。更重要的是,如果只有其中一個類可以真正實例化而不會導致錯誤。

此外,爲什麼object已從基類Config類的參數中省略?

因爲它純粹是可選的。在Python 2.6+中,它創建一箇舊式類而不是新式類,在Python 3.x中它沒有區別(並且注意,空的超類說明符在2.5或更早的版本中是無效的語法;應省略parens完全)。

3

在Python中,類是對象。因此該字典中的development鍵的值爲類DevelopmentConfig。這樣,您可以撥打config['development'](),並且您將有一個初始化的DeveloptmentConfig對象。至於object被省略了,在Python 3中,如果沒有父類給定一個新類,它會自動產生子類object