属性不存在时返回 None

9 投票
2 回答
8283 浏览
提问于 2025-04-17 23:04

在编程中,有时候我们需要把一些数据从一个地方转移到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。为了做到这一点,我们通常会用到一些工具或方法。

有些时候,我们可能会遇到一些问题,比如数据在转移的过程中可能会丢失,或者格式不对。这就像你在倒水的时候,水可能会洒出来,或者倒得太快导致杯子满了。

为了避免这些问题,我们需要仔细检查每一步,确保数据能够安全、准确地转移到目标位置。这就像在倒水之前,先确认杯子是干净的,且没有裂缝。

总之,数据转移是编程中一个很重要的部分,我们需要掌握一些基本的方法和技巧,才能顺利完成这个过程。

class test(object):
def __init__(self, a = 0):
    test.a = a

t = test()

print test.a ## obviously we get 0

''' ====== Question ====== '''

print test.somethingelse ## I want if attributes not exist, return None. How to do that?

2 个回答

1

你在寻找 __getattribute__ 这个钩子。像下面这样的代码应该能满足你的需求:

class test(object):
    def __init__(self, a = 0):
        self.a = a

    def __getattribute__(self, attr):
        try:
            return object.__getattribute__(self, attr)
        except AttributeError:
            return None
20

首先,你是在给类添加变量 test.a = a。其实你应该把它添加到实例上,也就是 self.a = a。因为当你把一个值加到类上时,所有的实例都会共享这个数据。

你可以像这样使用 __getattr__ 函数:

    class test(object):
        def __init__(self, a = 0):
            self.a = a

        def __getattr__(self, item):
            return None

    t = test()

    print t.a
    print t.somethingelse

引用一下 __getattr__ 的文档,

当在常规地方找不到属性时会被调用(也就是说,它不是实例属性,也没有在类的层级结构中找到)。name 是属性的名称。

注意: __getattr__ 相比于 __getattribute__ 的好处在于,__getattribute__ 会一直被调用,即使当前对象有这个属性,我们也得手动处理。但如果属性在层级结构中找到了,__getattr__不会被调用。

撰写回答