我应该使用继承覆盖默认字段吗?

弗洛里安·法斯迈尔

编辑:ChatterOne的答案很好。我必须保持简单。没有奇怪或古怪的行为值得避免重复简单,明确和有用的变量。

我想要的(伪代码示例):摆脱“服务器”参数。

Config.default_values.server = Server.application
class ApplicationDbConfig(Enum):
    database_1 = Config(Database.db1)
    database_2 = Config(Database.db2)
    ...


Config.default_values.server = Server.warehouse
class WarehouseDatabaseConfig(Enum):
    database_1 = Config(Database.db1)
    database_2 = Config(Database.db2)
    ...

最好的解决方案是:

保持变量明确。无需隐藏它或在内部更改状态。明确明确是更好的选择。因此,我将放弃摆脱的目标,s并将其保持简单。

s = Server.application
class ApplicationDatabaseConfig(Enum):
    database_1 = Config(Database.db1, s)
    database_2 = Config(Database.db2, s)
    ...


s = Server.warehouse
class WarehouseDatabaseConfig(Enum):
    database_1 = Config(Database.db1, s)
    database_2 = Config(Database.db2, s)
    ...

最初的问题是:使用继承覆盖默认参数是否值得?还是您有更好的方法呢?

这是我用于继承的原始代码。这占用了太多空间,并给观看者增加了很多噪音。

@dataclass
class Config:
    database: Database
    server: Server
    driver: Driver = Driver.sql_serv_native_client_11
    is_trusted: bool = True
    additional_params: str = None


@dataclass
class ApplicationConfig(Config): server: Server = Server.application
    
@dataclass
class WarehouseConfig(Config): server: Server = Server.warehouse

...

class ApplicationDatabasesConfig(Enum):
    database_1 = ApplicationConfig(Database.db1)
    database_2 = ApplicationConfig(Database.db2)
    ...


class WarehouseDatabasesConfig(Enum):
    database_3 = WarehouseConfig(Database.db3)
    database_4 = WarehouseConfig(Database.db4)
    ...
ter不休

假设您要使用不同的参数实例化同一类,除了少数可能具有或没有默认值的参数外,我会做类似的事情(未经测试,只是快速键入),还假设您有一个默认驱动程序:

class Config:
    def __init__(self, database, server=Server.serverX, driver=Driver.default, is_trusted=True, additional_params=None):
        self.database = database
        self.driver = driver
        self.server = server
        self.is_trusted = is_trusted
        self.additional_params = additional_params

然后您可以像这样使用它:

database_1 = Config(Database.db1)
database_2 = Config(Database.db2)
database_3 = Config(Database.db3)
database_4 = Config(Database.db4, Server.serverY)

但这对我来说直截了当,所以也许我错过了一些东西。

顺便说一句,您也可以将其与命名参数一起使用,例如

database_4 = Config(database=Database.db4, server=Server.serverY)

如果您想要更详细/明确(再次,未经测试,可能有错别字)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章