Python-使用类“ get”方法时如何返回不同的值?

时间:2019-04-29 01:08:58

标签: python class variables

我想覆盖类中变量的get方法。 (我不确定该如何解释。)

我曾尝试过在Google上进行搜索,但没有任何帮助。

我的代码:

class Class():
    self.foo = ['foo','bar']

print(Class().foo)

我要制作它,以便默认情况下它会打印出' '.join(Class().foo)而不是Class().foo

您是否可以在代码中添加一些东西来使它像这样?

2 个答案:

答案 0 :(得分:2)

您可以覆盖__getattribute__来做到这一点:

class Thingy:

    def __init__(self):
        self.data = ['huey', 'dewey', 'louie']
        self.other = ['tom', 'jerry', 'spike']

    def __getattribute__(self, attr):
        if attr == 'data':
            return ' '.join(super().__getattribute__(attr))

        else:
            return super().__getattribute__(attr)

print(Thingy().data)
print(Thingy().other)

输出:

huey dewey louie
['tom', 'jerry', 'spike']

Python 2版本:

class Thingy(object):

    def __init__(self):
        self.data = ['huey', 'dewey', 'louie']
        self.other = ['tom', 'jerry', 'spike']

    def __getattribute__(self, attr):
        if attr == 'data':
            return ' '.join(super(Thingy, self).__getattribute__(attr))

        else:
            return super(Thingy, self).__getattribute__(attr)

print(Thingy().data)
print(Thingy().other)

请注意,通过覆盖__getattribute__很容易进入无限循环,因此您应该小心。

实际上,几乎可以肯定有一种不那么吓人的方法,但是我现在想不起来。

答案 1 :(得分:1)

您可能想使用@property包装器,而不是将foo定义为属性。您可以将要打印的参数存储在私有类变量中,然后定义foo的行为以返回字符串join。

class Class:
    _foo = ['foo', 'bar']

    @property
    def foo(self):
        return ' '.join(self._foo)

print(Class().foo)
# prints:
foo bar