【发布时间】:2020-10-06 09:14:33
【问题描述】:
编辑: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)
...
【问题讨论】:
-
我不确定,也许我在这里遗漏了什么,但是为什么不在创建实例时传递服务器名称或配置并在类的
__init__中读取它? -
因为我想去掉那个参数。由于我在ServerX中有很多数据库,所以我不得不多次编写参数server=Server.serverX。这似乎是多余的。
-
我还是不明白你的意思,抱歉。您只需编写一次 server = config.server ,即在基类的 init 方法中。然后,当您使用
config = Config(server1)或config = Config(server2)之类的内容实例化该类时。 -
我做了一个更好的例子来说明我要归档的内容。我希望它能澄清我要做的事情。顺便说一句,谢谢你的帮助。我会尽量说清楚!
-
您的最新示例正是我的意思,我认为这就是您应该如何实现它。也许我会尝试写一个答案,看看是否是你的意思。
标签: python python-3.x class enums