2017-03-26 4 views
0

Ich verfolge ein Tutorial über Python Kolben. Ich habe ein config.py wie so:Python-Wörterbuch mit Init-Objekten

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 
} 

Ich bin verwirrt über den Config-Wörterbuch am unteren Ende. Zum Beispiel zeigt 'development': DevelopmentConfig auf ein initialisiertes DevelopmentConfig Objekt? Warum ist es nicht 'development': DevelopmentConfig(). Auch warum wurde object aus den Argumenten in der Basis Config Klasse weggelassen?

Antwort

2

Zum Beispiel zeigt 'development': DevelopmentConfig auf einen initialisierten DevelopmentConfig Objekt?

Nein, es enthält einen Verweis auf die DevelopmentConfig Klasse.

Warum ist es nicht 'development': DevelopmentConfig().

Da dies möglicherweise nicht der geeignete Ort, um die Klasse zu instanziieren. Auch wenn nur eine der Klassen tatsächlich instanziiert werden kann, ohne einen Fehler zu verursachen.

Auch warum hat object von den Argumenten in der Basis Config Klasse weggelassen worden?

Weil es rein optional ist. In Python 2.6+ erstellt es eine Klasse im alten Stil statt einer Klasse im neuen Stil, und in Python 3.x macht es keinen Unterschied (und beachten Sie, dass ein leerer Oberklassenbezeichner eine ungültige Syntax in 2.5 oder älter ist; die Parens sollten weggelassen werden vollständig).

3

In Python sind Klassen Objekte. So hat der Schlüssel development in diesem Wörterbuch einen Wert, der die Klasse DevelopmentConfig ist. Auf diese Weise können Sie config['development']() aufrufen, und Sie haben ein initialisiertes Objekt DeveloptmentConfig. Wie für object weggelassen, in Python 3, wenn keine Elternklasse in eine neue Klasse gegeben ist, ist es automatisch Unterklassen object.