书中学习Python第5版(o'reilly Mark Lutz)第912页)
class PrivateExc(Exception): pass # More on exceptions in Part VII
class Privacy:
def __setattr__(self, attrname, value): # On self.attrname = value
if attrname in self.privates:
raise PrivateExc(attrname, self) # Make, raise user-define except
else:
self.__dict__[attrname] = value # Avoid loops by using dict key
class Test1(Privacy):
privates = ['age']
class Test2(Privacy):
privates = ['name', 'pay']
def __init__(self):
self.__dict__['name'] = 'Tom' # To do better, see Chapter 39!
也许第5行是错误的raise PrivateExc(attrname, self)
,
self 参数将被设置为位置 1。
该行是否会更改为 raise PrivateExc(self,attrname)
?为什么不呢?
最佳答案
其实这并不重要。
从 Exception
进行子类化而不使用任何附加构造函数不会限制您可以作为参数传递给异常类的内容。您可以按照您想要的任何顺序传递它们。
传递给 PrivateExc
类的参数只是作为实例属性 .args
存储在实例中
示例:
>>> class MyError(Exception):
... """MyError"""
...
>>> e = MyError("foo", "bar")
>>> e.args
('foo', 'bar')
>>> e
MyError('foo', 'bar')
这在您正在阅读的书中基本上意味着什么;
如果你要捕获异常PrivateExc
,你会这样做:
try:
...
except PrivateExc as error:
attrname, obj = error.args
...
关于python - self 在 python 类中处于哪个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24838179/