属性不存在时返回 None
在编程中,有时候我们需要把一些数据从一个地方转移到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。为了做到这一点,我们通常会用到一些工具或方法。
有些时候,我们可能会遇到一些问题,比如数据在转移的过程中可能会丢失,或者格式不对。这就像你在倒水的时候,水可能会洒出来,或者倒得太快导致杯子满了。
为了避免这些问题,我们需要仔细检查每一步,确保数据能够安全、准确地转移到目标位置。这就像在倒水之前,先确认杯子是干净的,且没有裂缝。
总之,数据转移是编程中一个很重要的部分,我们需要掌握一些基本的方法和技巧,才能顺利完成这个过程。
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__
就不会被调用。