假设我有两个类A和B。在类A中,将创建B的实例。它们的两个实例方法都将使用一个公共变量,该变量在类a中初始化。我必须通过init函数传递公共变量。如果我有A,B,C,D。。。。还有普通的var1,var2,var3…所有的var都必须通过一个类传递到另一个类,这很糟糕:
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”关系。但这个问题的核心部分是,公共变量起初并不常见,而是在这个类中初始化的。。你知道吗
我妥协了。我添加了一个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)
这样更好吗?你知道吗
如果您有四个类共享同一组四个属性,那么您可能(或不)使用继承—但这实际上取决于这些属性的使用方式/内容以及这些类之间的真正关系。继承是一种“is a”关系(如果B从a继承,那么B也就是a)。你知道吗
另一个解决方案-如果您没有真正的“is a”关系-是创建一个类来重新组合这四个属性,并在需要的地方传递这个类的实例。在这里,只有当这些属性之间存在真正的语义关系时,才有意义。你知道吗
哦,是的,使用globals通常不是解决方案(除非这些变量实际上是伪常量-在启动时设置一次,任何人都不会更改)。你知道吗
长话短说:对你的问题没有一刀切的答案,合适的解决方案取决于你的具体用例。你知道吗
编辑:
根据您的补充说明,它看起来像“货物类”解决方案(将所有“共享”属性分组到同一个对象中)可能是您想要的。请注意,它会将您的所有类耦合到此类,这可能是一个问题(wrt/测试和可维护性)。如果驱动你的A/B/C/D类进化的力量基本相同,那么你应该是好的。。。你知道吗
相关问题 更多 >
编程相关推荐