在为班级成员设定价值时如何保护错字?

lst*_*kov 5 python

请考虑以下示例:

class A():
    def __init__(self):
        self.veryImportantSession = 1

a = A()
a.veryImportantSession = None # ok

# 200 lines below
a.veryImportantSessssionnnn = 2 # I wanna exception here!! It is typo!
Run Code Online (Sandbox Code Playgroud)

如果我尝试设置未设置的成员,我怎么能这样做才会引发异常__init__

上面的代码在执行时不会失败,但是给我一个有趣的时间来调试问题.

跟str一样:

>>> s = "lol"
>>> s.a = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud)

谢谢!

mik*_*kej 6

您可以覆盖__setattr__以仅允许来自已定义列表的属性名称.

class A(object):
    def __setattr__(self, name, value):
        allowed = ('x',)
        if name in allowed:
            self.__dict__[name]  = value
        else:
            raise AttributeError('No attribute: %s' % name) 
Run Code Online (Sandbox Code Playgroud)

在操作中:

>>> a = A()
>>> a.x = 5
>>> a.other = 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "myc.py", line 7, in __setattr__
    raise AttributeError('No attribute: %s' % name)
AttributeError: No attribute: other   
Run Code Online (Sandbox Code Playgroud)

但是,正如msw所评论的那样,尝试使Python更像Java或C++的行为通常是一个坏主意,并且会导致失去Python提供的许多好处.如果您担心可能会错过拼写错误,那么您最好花时间为代码编写单元测试,而不是试图锁定类的使用.

  • 同意w /单元测试,但这是避免拼写错误的最佳方法吗? (2认同)
  • 在很多情况下,用户代码能够将任意属性分配给类非常有用,而不会让类本身关注它们.这将无缘无故打破这一点.还要记住,这只会在运行时捕获任何内容,而不是编译时.除非您有特殊原因,否则请勿这样做. (2认同)