Python相互依赖的类默认值

时间:2015-03-22 15:23:26

标签: python

我不确定这是否是一个完全荒谬的问题,但我在某处错过了一个关键的python行为......

原则上我希望在一个类中定义一些默认值,这对任何用户都应该是完全正常的。但是,如果有人想要更改它们,则应该允许它。

import os

class Defaults:

    # Define default directories
    main_directory = os.getcwd() + "/"
    sub_directory1 = main_directory + "Sub_directory_1/"
    sub_directory2 = main_directory + "Sub_directory_2/"

    # Define default parameters
    par1 = 10
    par2 = 20

目录用于输出一些输出,但是,我想在开头用

指定差异main_directory
Defaults.main_directory = /path/to/somewhere/else/

当我调用

时,子目录也应相应地改变所有后续调用
Defaults.sub_directory1

参数相同。我想要定义一些在许多函数中多次使用的默认值。我想要的就是能够在脚本的最开始通过比如

来改变它们
Defaults.par1 = 70

以便在所有其他调用中,此值将更改为70。

我用__init__()尝试了很多事情,但我不确定我做错了什么。

我希望你能提供帮助。 谢谢

这是附录中的一个真实世界的例子:

import os

class Defaults:

    main_directory = os.getcwd() + "/"
    sub_dir = main_directory + "Sub1/"

print(Defaults.main_directory)
print(Defaults.sub_dir)

Defaults.main_directory = "/path/to/somewhere/"

print(Defaults.main_directory)
print(Defaults.sub_dir)

最后一个打印语句的位置没有任何改变......

4 个答案:

答案 0 :(得分:1)

我不知道这是否正是您所需要的,但常见的模式是在类级别设置各种默认值(在下面的示例中为DEFAULTS),然后允许用户覆盖实例化新对象时的那些默认值。这是一个简化的例子:

import os

class Fubb:

    DEFAULTS = dict(
        main_dir = '/foo/bar',
        sub_dir  = 'blah',
    )

    def __init__(self, main_dir = None, sub_dir = None):
        ds = self.DEFAULTS
        self.main_dir = main_dir or ds['main_dir']
        self.sub_dir = os.path.join(self.main_dir, sub_dir  or ds['sub_dir'])

    def __repr__(self):
        return str(vars(self))

print Fubb()
print Fubb(main_dir = '/bazz')
print Fubb(main_dir = '/bazz', sub_dir = 'abc')

答案 1 :(得分:0)

以下是我认为你要做的事情:

import os

class Defaults:
    def __init__(self):
        self.main_dir = os.getcwd() + '/'
        self.sub_dir = 'sub1/'
    def getPath(self):
        return self.main_dir + self.sub_dir

在此代码中,“self”指的是类的实例,而不是类定义本身。您可以在命令行会话中查看其工作原理:

>>> d = Defaults()   # <--- create an instance of Defaults
>>> d.main_dir
'/Users/someuser/'
>>> d.sub_dir
'sub1/'
>>> d.getPath()
'/Users/someuser/sub1/'
>>> d.main_dir = '/some/other/dir/'
>>> d.getPath()
'/some/other/dir/sub1/'

答案 2 :(得分:0)

直接更改属性并不总是最佳选择。如果您希望在更改subdir后动态更改main_directory,最简单的方法是添加一个特定方法,该方法将更改所有相关属性,以便您的类看起来像:

class Default(object):
    def __init__(self):
        self.main_directory = '/some/dir'
        self.subdir = self.main_directory + '/subdir'

    def change_dir(self, dir):
        self.main_directory = dir
        self.subdir = dir + '/subdir'

您也可以考虑使用更高级的Python功能,例如propertiesdescriptors

答案 3 :(得分:0)

按照对我之前回答的评论,这里有一种方法可以使用默认值作为单身来存储一组通用值:

class Defaults:
    a = 'some value'
    b = 'another value'

class Foo(Defaults):
    def combine(self):
        return ','.join([Defaults.a, Defaults.b])

这是一个翻译会议:

>>> f1 = Foo()
>>> f2 = Foo()
>>> f1.combine()
'some value,another value'
>>> f2.combine()
'some value,another value'
>>> Defaults.a = 'new value'
>>> f1.combine()
'new value,another value'
>>> f2.combine()
'new value,another value'