객체생성

응용프로그램에서 다른 동작을 수행하는 가장 좋은방법은 인터페이스 구현을 인스턴스화하는 것 입니다.

한 데이터베이스 인터페이스는 다른 데이터베이스 드라이버에 의해 구현된 connect() 메서드를 가집니다.

class DBConnection:
    def connect(self):
        pass
class MySQLConnection(DBConnection):
    def __init__(self, host, user, password):
        self.host = host
        self.user = user
        self.password = password
    def connect(self):
        print(
            "MySQL connecting to {} with user={} and password={}".format(
                self.host, self.user, self.password
            )
        )
class PostgreSQLConnection(DBConnection):
    def __init__(self, host, user, password, database):
        self.host = host
        self.user = user
        self.password = password
        self.database = database
    def connect(self):
        print(
            "PostgreSQL connecting to {} "
            "with user={} and password={} and database={}".format(
                self.host, self.user, self.password, self.database
            )
        )

이것을 제공하기 위해, 우리는 우리는 병렬적인 설정구조를 가질 수 있습니다.

conf/
├── config.yaml
└── db
    ├── mysql.yaml
    └── postgresql.yaml

설정파일: config.yaml

defaults:
  - db: mysql

설정파일: db.mysql.yaml

model:
db:
  class: tutorial.objects_example.objects.MySQLConnection
  params:
    host: localhost
    user: root
    password: 1234

설정파일: db/postgresql.yaml

db:
  class: tutorial.objects_example.objects.PostgreSQLConnection
  params:
    host: localhost
    user: root
    password: 1234
    database: tutorial

이를통해, 당신은 한줄의 코드로 객체를 인스턴스화 할 수 있습니다.

@hydra.main(config_path="conf/config.yaml")
def my_app(cfg):
    connection = hydra.utils.instantiate(cfg.db)
    connection.connect()

MySQL은 파일에 따라 config.yaml의 기본값 입니다.

$ python my_app.py
MySQL connecting to localhost with user=root and password=1234

인스턴스화 된 객체 클래스를 변경하고 커맨드라인에서 값을 재정의 하세요.

$ python my_app.py db=postgresql db.params.password=abcde
PostgreSQL connecting to localhost with user=root and password=abcde and database=tutorial