是否可以将属性分配给'Nonetype' object
以告诉Python如果调用它们该怎么做?
这是我的问题:
我有一个类作为库来存储myOtherObject
的实例。在添加实例之前,它首先检查该密钥是否已存在,然后将数据附加到分配给该密钥的实例,而不是覆盖它。
class MyClass:
def __init__(self):
self.myLibrary = {}
def __setitem__(self, key, item):
if key not in self.myLibrary:
self.myLibrary[key] = myOtherObject(name=item[0], attr1=[item[1]], attr2=[item[2]])
else:
self.myLibrary[key].attr1.append(item[1])
self.myLibrary[key].attr2.append(item[2])
def __getitem__(self, key):
if key in self.myLibrary:
return self.myLibrary[key]
else:
return None #???
从库中检索数据时,它应检查密钥是否也存在,并且仅在密钥存在时才返回分配的对象。这样可以正常工作或仅调用对象,但是在调用该对象的属性时则不行:
>>> o = MyClass()
>>> o['key1'] = ['name1','b','c']
>>> o['key1']
<__main__.myOtherObject instance at 0x05509B48>
>>> o['key1'].attr1
'b'
>>> o['key2']
>>> o['key2'].attr1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'attr1'
我能以某种方式告诉Python不要做任何事情,只要在None
调用属性attr1
和attr2
时返回'NoneType' object
吗?
答案 0 :(得分:1)
使用getattr
:
>>> o = None
>>> print getattr(o, "attr1", None)
None
答案 1 :(得分:1)
这可能是一个错误的问题。 __getitem__
方法中适当的(pythonic)事件是引发KeyError
异常。然后在调用者中处理该异常,或者在可以处理它的适当位置更高处理。
答案 2 :(得分:-1)
是否可以将属性分配给'Nonetype'对象
没有。
>>> o = None
>>> o.foo = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'foo'
>>> setattr(o,'foo',1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'foo'
>>> getattr(o,'foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'foo'
在添加实例之前,它首先检查该密钥是否已存在,然后将数据附加到分配给该密钥的实例,而不是覆盖它。
这是defaultdict的经典用例:
import collections
d = collections.defaultdict(list)
d['foo'].append(1)
print d #=> defaultdict(<type 'list'>, {'foo': [1]})
从库中检索数据时,它应检查密钥是否也存在,并且仅在密钥存在时才返回分配的对象。这样可以正常工作或仅调用对象,但是在调用该对象的属性时则不行:
行。当密钥不存在时,您希望发生什么?
当我从'NoneType'对象调用属性attr1和attr2时,我能以某种方式告诉Python不要做任何事情并且只返回None吗?
这是什么意思?如果您尝试访问不存在的属性,则会出现异常,如上所述。解决方案是处理异常,并返回None
;但是让异常传播会更好 ,因为None
不是有效的输入。
总之,您可以使用defaultdict实现所需的一切。可能不会创建自己的类。