请考虑以下示例:
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)
谢谢!
您可以覆盖__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提供的许多好处.如果您担心可能会错过拼写错误,那么您最好花时间为代码编写单元测试,而不是试图锁定类的使用.
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |