Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使许多参数可用于整个系统?_Python_Design Patterns - Fatal编程技术网

Python 如何使许多参数可用于整个系统?

Python 如何使许多参数可用于整个系统?,python,design-patterns,Python,Design Patterns,我有来自不同类的对象,它们一起工作以执行特定任务。该任务需要大量由用户(通过配置文件)提供的参数。这些参数在系统内部使用 我可以选择让控制器对象读取配置文件,然后根据需要将参数分配给下一层对象,依此类推。但是只有对象本身知道它们需要哪些参数,因此控制器对象需要了解关于其他对象的很多细节 另一种选择是将所有参数捆绑到一个集合中,并将整个集合传递到每个函数调用中(等效地,创建一个存储它们的全局对象,并且每个人都可以访问)。这看起来和感觉都很难看,并且会导致各种小技术问题(例如,我不能允许两个对象使用

我有来自不同类的对象,它们一起工作以执行特定任务。该任务需要大量由用户(通过配置文件)提供的参数。这些参数在系统内部使用

我可以选择让控制器对象读取配置文件,然后根据需要将参数分配给下一层对象,依此类推。但是只有对象本身知道它们需要哪些参数,因此控制器对象需要了解关于其他对象的很多细节

另一种选择是将所有参数捆绑到一个集合中,并将整个集合传递到每个函数调用中(等效地,创建一个存储它们的全局对象,并且每个人都可以访问)。这看起来和感觉都很难看,并且会导致各种小技术问题(例如,我不能允许两个对象使用同名参数;等等)


该怎么办?

我希望你不要觉得我在劫持你的线程-你所问的与我在属性聚合方面的想法类似,以避免你想要避免的模型

我还感受到了一点“长生不老药”带给我的陈述性氛围

我很好奇,堆栈溢出的Python大师们是怎么想的,还有什么更好的替代方案。我不喜欢大的kwargs,如果我能避开大的构造器,我更喜欢

#!/usr/bin/python

import inspect
from itertools import chain, ifilter
from pprint import pprint
from abc import ABCMeta

class Property(object):

    def __init__(self, value=None):
        self._x = value

    def __repr__(self):
        return str(self._x)

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    def delx(self):
        del self._x

    value = property(getx, setx, delx, "I'm the property.")

class BaseClass(object):

    unique_baseclass_thing = Property()

    def get_prop_tree(self):
        mro = self.__class__.__mro__
        r = []
        for i in xrange( 0, len(mro) - 1 ):

            child_prop_names = set(dir(mro[i]))
            parent_prop_names = set(dir(mro[i+1]))

            l_k = list( chain( child_prop_names - parent_prop_names ) )
            l_n = [ (x, getattr(mro[i],x,None)) for x in l_k ]
            l_p = list( ifilter(lambda y: y[1].__class__ == Property, l_n))

            r.append(
                (mro[i],
                    (dict
                        ( l_p )
                    )
                )
            )
        return r

    def get_prop_list(self):
        return list( chain(* [ x[1].items() for x in reversed( self.get_prop_tree() ) ] ) )


class SubClass(BaseClass):
    unique_subclass_thing = Property(1)

class SubSubClass(SubClass):
    unique_subsubclass_thing_one = Property("blah")
    unique_subsubclass_thing_two = Property("foo")

if __name__ == '__main__':

    a = SubSubClass()

    for b in a.get_prop_tree():
        print '---------------'
        print b[0].__name__
        for prop in b[1].keys():
            print "\t", prop, "=", b[1][prop].value
        print

    for prop in a.get_prop_list():
当你运行它时


我过去使用过“全球收藏”替代品


如果您关心命名:您将如何在配置文件中处理此问题?在我看来,您的全局集合是一个数据结构,表示配置文件中的相同信息,因此,如果您有办法解决或避免cfg文件中的名称冲突,您可以在全局集合中执行相同的操作。

您对cfg文件名名冲突的看法是正确的。我想拥有这个cfg文件是否是一个好主意是问题的一部分。。。我并没有看到任何替代方法。如果您有很多参数,那么以某种方式划分配置名称空间以使其更易于管理是有意义的。在cfg文件中,您可以使用节(例如,像[this]这样的标题,像旧的windows.ini文件)或前缀(heading.subheading.parameter),或者使用一个完整的层次结构,比如XML。你的配置对象可以用同样的方式构造,你可以只把相关的子树传递给函数,我一点也不介意。不过,我不确定是否有很多人意识到你在问一个问题。嗯,我问一个问题和回答一个问题一样多——这是我对你试图做的事情的方法。。有很多方法可以剥猫皮(可以这么说……),只要在“python singleton”上进行堆栈溢出搜索,看看我的意思我对你的方法很感兴趣。但是你会如何适应我的情况呢?
SubSubClass
    unique_subsubclass_thing_one = blah
    unique_subsubclass_thing_two = foo

---------------
SubClass
    unique_subclass_thing = 1

---------------
BaseClass
    unique_baseclass_thing = None

unique_baseclass_thing None
unique_subclass_thing 1
unique_subsubclass_thing_one blah
unique_subsubclass_thing_two foo