编辑: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)
...
答案 0 :(得分:2)
假设您要使用不同的参数实例化同一类,除了少数可能具有或没有默认值的参数外,我会做类似的事情(未经测试,只是快速键入),还假设您有默认驱动程序:
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)
如果您想要更详细/明确(再次,未经测试,其中可能有错别字)。