0

在 Python 中(我在这里说的是 2,但也有兴趣了解 3)是否有一种方法可以提前定义您想要可用的所有实例变量(成员字段)的列表,即使用一个错误'还没有在某处定义?

就像是

class MyClass(object):
    var somefield
    def __init__ (self):
        self.somefield = 4
        self.banana = 25      # error!

有点像你在 Java、C++、PHP 等中所做的

编辑:

我想要这种东西的原因是尽早发现使用最初没有设置的变量。似乎 linter 实际上会在没有任何额外管道的情况下发现这些错误,所以也许我的问题没有实际意义......

4

2 回答 2

5

为什么是的,你可以。

class MyClass(object):
    __slots__ = ['somefield']
    def __init__ (self):
        self.somefield = 4
        self.banana = 25      # error!

请注意警告

于 2013-02-07T15:11:29.457 回答
0

您可以使用上面发布的答案,但对于更“pythonic”的方法,请尝试(链接到 code.activestate.com)中列出的方法

以供将来参考,在我弄清楚如何链接到该网站之前,代码如下:

def frozen(set):
    """Raise an error when trying to set an undeclared name, or when calling
       from a method other than Frozen.__init__ or the __init__ method of
       a class derived from Frozen"""
    def set_attr(self,name,value):
        import sys
        if hasattr(self,name):                                  #If attribute already exists, simply set it
            set(self,name,value)
            return
        elif sys._getframe(1).f_code.co_name is '__init__':     #Allow __setattr__ calls in __init__ calls of proper object types
            for k,v in sys._getframe(1).f_locals.items():
                if k=="self" and isinstance(v, self.__class__):
                    set(self,name,value)
                    return
        raise AttributeError("You cannot add attributes to %s" % self)
    return set_attr
于 2013-02-07T15:20:19.353 回答