带有init对象的Python字典

时间:2017-03-26 07:17:56

标签: python

我正在关注Python烧瓶的教程。我有config.py这样:

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 <flasky@example.com>'
    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 个答案:

答案 0 :(得分:3)

在Python中,类是对象。因此,该字典中的development键具有类DevelopmentConfig的值。这样,您就可以调用config['development'](),并且您将拥有一个初始化的DeveloptmentConfig对象。至于省略object,在Python 3中,如果没有给予新类的父类,它会自动子类object

答案 1 :(得分:2)

  

例如,'development': DevelopmentConfig是否指向初始化的DevelopmentConfig对象?

不,它包含对DevelopmentConfig类的引用。

  

为什么不是'development': DevelopmentConfig()

因为这可能不是实例化类的合适位置。另外,如果实际上只有一个类可以实例化而不会导致错误。

  

为什么object从基类Config类中的参数中省略了?

因为它纯粹是可选的。在Python 2.6+中它创建了一个旧式类而不是新式类,并且在Python 3.x中它没有区别(并注意空的超类说明符是2.5或更旧的无效语法;应该省略parens完全)。