在Python中,您能提前声明所有可用的实例变量吗?

时间:2013-02-07 15:07:28

标签: python class

在Python中(我在这里谈论2,但也有兴趣了解3)是否有一种方法可以预先定义所需的所有实例变量(成员字段)的列表,即使其成为错误使用你没有定义的地方?

这样的东西
class MyClass(object):
    var somefield
    def __init__ (self):
        self.somefield = 4
        self.banana = 25      # error!

有点像你在Java,C ++,PHP等中做的那样

修改

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

2 个答案:

答案 0 :(得分:4)

为什么是的,你可以。

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

但是mind the caveats

答案 1 :(得分: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