通过阅读您的问题,听起来变量表示层次结构中包含可变值的节点,因此我同意将变量子类化以实现不同的机制来获取其值似乎是不正确的。
忽略数据结构和 get/set 接口,我建议这种架构:
class Variable(object):
def __init__(self, value=None):
if value is not None and not isinstance(value, ValueProducer):
raise TypeError("Expected a ValueProducer.")
self.__value = value
def getValue(self):
return self.__value.produce() if self.__value else None
def setValue(self, value):
if value is not None and not isinstance(value, ValueProducer):
raise TypeError("Expected a ValueProducer.")
self.__value = value
class ValueProducer(object):
def produce(self):
raise NotImplementedError()
class SimpleValueProducer(ValueProducer):
def __init__(self, value):
self.__value = value
def produce(self):
return self.__value
class HttpRequestValueProducer(ValueProducer):
def __init__(self, url, params, method="GET"):
self.__url = url
self.__params = params
self.__method = method
def produce(self):
# Implementation omitted.
return "Stub for HTTP request: " \
+ ", ".join((self.__url, str(self.__params), self.__method)
>>> v1 = Variable(SimpleValue("foo"))
>>> print v1.getValue()
foo
>>> v1.setValue(HttpRequestValue("http://localhost:8080", {"bar": "baz"}))
>>> print v1.getValue()
Stub for HTTP request: http://localhost:8080, {'bar': 'baz'}, GET
>>> v1.setValue("test")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test3.py", line 13, in setValue
raise TypeError("Expected a ValueProducer.")
TypeError: Expected a ValueProducer.
>>> v2 = Variable()
>>> print v2.getValue()
None
我为 ValueProducer 使用一个类以及实现其接口的子类的原因是为了提高一些可重用性,尤其是对于需要大量代码来检索的值。
附带说明一下,在您的问题中获取和设置值的路径语法似乎有点尴尬:找到一个节点并直接设置它的值感觉更自然,而不是在 parent.setValue(path,价值)。可能值得研究使用库中的树数据结构,而不是重新发明它。
希望这能给你一些想法!