我正在尝试 python-koans:
定义了一个旧样式类:
class A:
pass
我们知道旧式类没有__class__
定义。
提供了一个断言声明,我需要通过。
self.assertEqual(__, A.__class__)
我应该在空白处填写一些值,即第一个参数,以便它通过。A.__class__
将引发属性错误。我应该如何通过这个测试?
这是一个糟糕的主意,但是,嘿——Python 可以让你做任何事情,对吧?
assertEqual(setattr(A, "__class__", type) or type, A.__class__)
我想我可能是在作弊。
使用type()
而不是尝试.__class__
直接访问。对于旧式类,这将返回types.ClassType
:
>>> from types import ClassType
>>> class Foo: pass
...
>>> type(Foo) is ClassType
True
一般来说,对于每个 dunder(双下划线,__...__
)名称,都有一个 API 函数或运算符可用于这些钩子地址。使用 API 函数或运算符,而不是直接访问挂钩。例如使用str(f)
代替f.__str__()
等。
如果您正在针对异常进行测试,您可能希望使用assertRaises()
上下文管理器来测试特定的异常:
with self.assertRaises(Foo) as cm:
function_under_test()
然后,您仍然可以访问异常实例以cm.exception
进行进一步测试。
这可能无关紧要,但可能的用例将异常的类等同于特定的异常类。附上示例代码
try:
1/0
except (ZeroDivisionError) as e:
pass
#equate an exception with a class of exception
isinstance(e, ZeroDivisionError)