0

我正在尝试 python-koans:

定义了一个旧样式类:

class A:
    pass

我们知道旧式类没有__class__定义。

提供了一个断言声明,我需要通过。

self.assertEqual(__, A.__class__)

我应该在空白处填写一些值,即第一个参数,以便它通过。A.__class__将引发属性错误。我应该如何通过这个测试?

4

3 回答 3

1

这是一个糟糕的主意,但是,嘿——Python 可以让你做任何事情,对吧?

assertEqual(setattr(A, "__class__", type) or type, A.__class__)

我想我可能是在作弊。

于 2013-05-31T10:42:14.743 回答
1

使用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进行进一步测试。

于 2013-05-31T10:30:07.010 回答
0

这可能无关紧要,但可能的用例将异常的类等同于特定的异常类。附上示例代码

try:
    1/0
except (ZeroDivisionError) as e:
    pass
#equate an exception with a class of exception
isinstance(e, ZeroDivisionError)
于 2017-11-20T14:49:04.093 回答