初始化多类Python中使用的公共变量
假设我有两个类A和B。在类A中,将创建B的实例。它们的两个实例方法都将使用一个公共变量,该变量在类a中初始化。我必须通过init函数传递公共变量。如果我有A,B,C,D类。。。。常见的变量1,变量2,变量3…所有的变量都必须通过一个类传递给另一个类,这很糟糕:初始化多类Python中使用的公共变量,python,class,variables,Python,Class,Variables,假设我有两个类A和B。在类A中,将创建B的实例。它们的两个实例方法都将使用一个公共变量,该变量在类a中初始化。我必须通过init函数传递公共变量。如果我有A,B,C,D类。。。。常见的变量1,变量2,变量3…所有的变量都必须通过一个类传递给另一个类,这很糟糕: class A: def __init__(self, variable_part): self.common_var = "Fixed part" + variable_part self.bLi
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)
但我不认为这是个好主意,还有更好的主意吗
更新:
原来的问题是:
常见的变量是字符串的一系列前缀,例如“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”关系中。但这个问题的核心部分是,公共_var一开始并不常见,而是在其中一个类中初始化的
最后更新 我妥协了。我添加了一个助手类以重用公共值:
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)
这是一种更好的方法吗?如果您有四个类共享同一组四个属性,那么您可能(或不)使用继承-但这实际上取决于这些属性的使用方式/内容以及这些类之间的真正关系。继承是一种“是a”关系(如果B从a继承,那么B“也是a”) 另一个解决方案——如果你没有真正的“是一个”关系——是创建一个类来重新组合这四个属性,并在需要的地方传递这个类的实例。在这里,只有当这些属性之间存在真正的语义关系时,才有意义 哦,是的,使用全局变量通常不是解决方案(除非这些变量实际上是伪常量——在启动时设置一次,任何人都不会更改) 长话短说:对于你的问题没有一个一刀切的答案,合适的解决方案取决于你的具体用例 编辑:
根据您添加的解释,看起来“货物类”解决方案(将所有“共享”属性分组到同一个对象中)可能就是您想要的。请注意,它会将您的所有类耦合到此类,这可能是一个问题,也可能不是一个问题(wrt/测试和可维护性)。如果驱动A/B的力∕ C/D类的演变基本上是一样的,那么你应该是好的…我不同意你的“那太糟糕了”断言。这对我来说似乎很正常,这是处理初始化对象的一种非常自然的方式,特别是如果您希望两个
a
对象具有不同的common\u var
s以可预测的方式运行。您能否将C
和D
添加到您的示例中,以展示您认为这会失控的原因?我更新了问题,请查看@PatrickHaugh@Spike这仍然不足以确定哪种设计对您有意义,但从您所说的“货物类别”解决方案可能有意义。