我不确定这是否是一个完全荒谬的问题,但我在某处错过了一个关键的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_directoryDefaults.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)
最后一个打印语句的位置没有任何改变......
答案 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功能,例如properties和descriptors。
答案 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'