Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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_Dictionary - Fatal编程技术网

Python 我可以让字典充当具有默认返回值的属性吗?

Python 我可以让字典充当具有默认返回值的属性吗?,python,dictionary,Python,Dictionary,我不确定这是否可行,但我想让字典充当一个属性,在调用时返回一个默认值。基本上是这样的: class galaxy(object): def __init__(self): self.mass = {'total':10, 'gas':2, 'stellar':8} > gal = galaxy() ## call the dict like an attribute > g

我不确定这是否可行,但我想让字典充当一个属性,在调用时返回一个默认值。基本上是这样的:

class galaxy(object):
    def __init__(self):
        self.mass = {'total':10,
                     'gas':2,
                     'stellar':8}

> gal = galaxy()

## call the dict like an attribute
> gal.mass
10

## but also have access to the dict
> gal.mass['total']
10
> gal.mass['gas']
2

如果能做到这一点,最有效的方法是什么

我认为,对于您的最终用户来说,最不令人惊讶的结果是提供一个带有可选参数的访问方法,如下所示:

class galaxy(object):
    def __init__(self):
        self._mass = {'total':10,
                      'gas':2,
                      'stellar':8}
    def get_mass(self, body='total'):
        return self._mass[body]

gal = galaxy()
print gal.get_mass()
print gal.get_mass('gas')
或者,也许:

class galaxy(object):
    def __init__(self):
        self._mass = {'gas':2,
                      'stellar':8}
    def get_mass(self, body=None):
        if body is None:
            return sum(self._mass.values())
        return self._mass[body]

你为什么要这样做?这里有一个自定义对象,只需将mass设为一个成员,并将字典设为另一个成员即可。您可以为
galaxy
提供一个属性属性,该属性为您提供当前值
mass['total']
。这可以接受吗?可以用一个自定义元类来实现这一点。@AaronD:考虑一下:如果
gal.mass
返回
gal.mass['total']
如何引用
dict
本身?我只是想让最终用户更清楚一点。例如,每个星系都有许多不同的半径,而不是一堆属性(全质量半径、半质量半径、r200、维里等),我希望有一个类似字典的对象,允许gal.radius返回默认值(比如全质量半径),但用户可以选择不同的半径,例如gal.radius['r_virial']。