-1

是否可以将属性分配给'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

4

3 回答 3

0

这可能是一个错误的问题。在该方法中正确的(pythonic)事情__getitem__是引发KeyError异常。然后,您在调用者中处理该异常,或者在可以处理它的适当位置更高层。

于 2013-09-21T18:06:01.737 回答
0

使用getattr

>>> o = None
>>> print getattr(o, "attr1", None)
None
于 2013-09-21T17:52:32.733 回答
0

是否可以将属性分配给“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 来实现。可能不创建自己的类。

于 2013-09-21T18:00:59.743 回答