python - 初始化多个类 Python 中使用的公共变量
问题描述
假设我有两个类 A 和 B。在 A 类中,将创建 B 的实例。它们的两个实例方法都将使用一个公共变量,该变量在 A 类中初始化。我必须通过init函数传递 common_var。想想如果我有 A、B、C、D 类……和 common_var1、var2、var3……所有变量都必须通过类传递到类,那太可怕了:
class A:
def __init__(self, variable_part):
self.common_var = "Fixed part" + variable_part
self.bList = []
def add_B(self):
self.bList += [B(self.common_var)]
def use_common_var():
do_something(self.common_var)
class B:
def __init__(self, common_var):
self.common_var = common_var
def use_common_var():
do_something(self.common_var)
在这里使用全局有一种丑陋的方法:
class A:
def __init__(self, variable_part):
global common_var
common_var = "Fixed part" + variable_part
def use_common_var(self):
do_something(common_var)
class B:
def use_common_var(self):
do_something(common_var)
但我认为这不是一个好主意,还有更好的主意吗?
更新:
原来的问题在这里:
common_vars 是一系列字符串前缀,例如"https://{}:{}/rest/v1.5/".format(host, port)
等"mytest"
。
在 A 类中,我使用
"https://127.0.0.1:8080/rest/v1.5/interface01" and "mytest_a"
在 B 类中,我使用
"https://127.0.0.1:8080/rest/v1.5/interface02" and "mytest_b"
在 C 类中,我可以使用
"https://127.0.0.1:8080/rest/v1.5/get?name=123" and "mytest_c"
像这样的事情,我使用公共变量只是为了多路复用'https://{}:{}/rest/v1.5'
和"mytest"
部分,而这些 A、B、C 类中没有一个处于“is-a”关系。但是这个问题的核心部分是 common_var 一开始并不常见,而是在此类中的一个中初始化..
最终更新
我妥协了。我添加了一个Helper类来重用公共值:
class Helper:
@staticmethod
def setup(url, prefix):
Helper.COMMON_URL = url
Helper.prefix = prefix
# A always initiates first
Class A:
def __init__(self, host, port):
Helper.setup(
"https://{0}:{1}/rest/v1.5".format(host, port),
"test"
)
def use_common_var():
do_something(Helper.url, Helper.prefix)
class B:
def use_common_var():
do_somesthing(Helper.url, Helper.prefix)
class C:
def use_common_var():
do_something(Helper.url, Helper.prefix)
这是更好的方法吗?
解决方案
如果您有四个共享同一组四个属性的类,那么您可能(或不)使用继承 - 但这实际上取决于这些属性的使用方式/用途以及这些类之间的真正关系是什么。继承是一种“是”关系(如果 B 从 A 继承,那么 B 也“是”A)。
另一种解决方案——如果你没有真正的“是”关系——是创建一个重新组合这四个属性的类,并在需要的地方传递这个类的一个实例。同样,只有在这些属性之间存在真正的语义关系时才有意义。
哦,是的,使用全局变量通常不是解决方案(除非这些变量实际上是伪常量 - 在启动时设置一次并且从未被任何人更改)。
长话短说:您的问题没有万能的答案,适当的解决方案取决于您的具体用例。
编辑:
鉴于您添加的解释,它看起来像“货物类”解决方案(将所有“共享”属性分组在同一个对象中) 可能是您想要的。请注意,它会将您的所有类耦合到这个类,这可能是也可能不是问题(wrt/测试和可维护性)。如果推动你的 A / B ∕ C /D 类进化的力量基本相同,那么你应该很好......
推荐阅读
- sql-server - 无法从链接服务器“linked_server_name”的 OLE DB 提供程序“SQLNCLI11”获取行集
- swift - Swift:JSONSerialization.jsonObject 不适用于 json 转换为 json
- html - 如何在一周中的特定日期和特定时间显示 div 内容?
- eclipse - Sonarlint-apex 静态分析器代码质量
- sonarqube - SonarQube VSTS 拉取请求评论
- javascript - 将文本从输入(JS,jQuery)复制到剪贴板的问题
- java - Java比较器语法?
- objective-c - identifierForVendor 崩溃为 EXC_BAD_ACCESS
- r - R中的循环中的rbind
- java - request.getParameter 不适用于 PUT 或 DELETE