给'NoneType'对象属性

时间:2013-09-21 17:51:08

标签: python class python-2.7

是否可以将属性分配给'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调用属性attr1attr2时返回'NoneType' object吗?

3 个答案:

答案 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实现所需的一切。可能不会创建自己的类。