python - self 在 python 类中处于哪个位置?

标签 python class

书中学习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/

相关文章:

javascript - 如何将 JavaScript 函数的结果放入 python 变量中。 PyQt

python - 如何使用 csv 模块处理字段值内的双引号?

python - 使用 Gitlab 的 CI : QXcbConnection error 在 PyQt5 中自动化单元测试

java - Java 类对象是唯一的/单例的吗?

java - 如何在 Gradle 中查看我的依赖包的所有类名?

java - 如何在不同类型的 ArrayList 中使用相同的方法?

python - 将 numpy 数组设置为 None 是否释放内存?

python - 从列表末尾删除零

javascript - 对象未通过引用传递(CoffeeScript)

c++ - NULL 在类析构函数中