在Python中(我在这里谈论2,但也有兴趣了解3)是否有一种方法可以预先定义所需的所有实例变量(成员字段)的列表,即使其成为错误使用你没有定义的地方?
像
这样的东西class MyClass(object):
var somefield
def __init__ (self):
self.somefield = 4
self.banana = 25 # error!
有点像你在Java,C ++,PHP等中做的那样
修改
我想要这种事情的原因是尽早发现使用最初未设置的变量。似乎一个linter实际上会在没有任何额外管道的情况下选择这些错误,所以也许我的问题没有实际意义......
答案 0 :(得分:4)
为什么是的,你可以。
class MyClass(object):
__slots__ = ['somefield']
def __init__ (self):
self.somefield = 4
self.banana = 25 # error!
答案 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