关于Python:Python – 如何在使用类’get’方法时返回不同的值?

Python - How to return a different value when using a class 'get' method?

本问题已经有最佳答案,请猛点这里访问。

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

我试过在谷歌上搜索,但没有什么能真正帮到我。

我的代码:

1
2
3
4
class Class():
    self.foo = ['foo','bar']

print(Class().foo)

我想这样做,它将打印出默认的' '.join(Class().foo),而不仅仅是Class().foo

有什么可以添加到代码中使其成为那样的吗?


您可以覆盖__getattribute__来执行此操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

输出:

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

python 2版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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__很容易进入无限循环,因此应该小心。

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


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

1
2
3
4
5
6
7
8
9
10
class Class:
    _foo = ['foo', 'bar']

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

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