14

我只是在如下错误上花费了太长时间:

>>> class Odp():
    def __init__(self):
        self.foo = "bar"


>>> o = Odp()
>>> o.raw_foo = 3 # oops - meant o.foo

我有一个带有属性的类。我试图设置它,并想知道为什么它没有效果。然后,我回到原来的类定义,发现属性的名称稍有不同。因此,我正在创建/设置一个新属性,而不是本意。

首先,这不正是静态类型语言应该防止的错误类型吗?在这种情况下,动态类型的优势是什么?

其次,有没有办法在定义时禁止这样做Odp,从而省去了自己的麻烦?

4

1 回答 1

22

您可以__setattr__为此目的实现一个方法 - 这比经常被误用的方法更健壮__slots__(例如,__slots__当类继承时自动“丢失”,而__setattr__除非显式覆盖,否则仍然存在)。

def __setattr__(self, name, value):
  if hasattr(self, name):
    object.__setattr__(self, name, value)
  else:
    raise TypeError('Cannot set name %r on object of type %s' % (
                    name, self.__class__.__name__))

您必须确保您确实希望能够设置hasattr的名称成功,例如通过在类级别设置属性或在您的方法中使用而不是直接分配属性。(要禁止在而不是其实例上设置属性,您必须使用类似的特殊方法定义自定义元类)。object.__setattr____init__

于 2010-06-29T03:08:53.050 回答