__abstractmethods__
является дескриптором для поддержки абстрактных базовых классов ; он портит слот , который по умолчанию пуст (поэтому дескриптор вызывает ошибку атрибута). Прежде всего, это деталь реализации того, как CPython обрабатывает абстрактные методы.
Атрибут используется для отслеживания абстрактных методов, поэтому экземпляры могут быть заблокированы от создания, если они не предоставляют конкретные реализация:
>>> import abc
>>> class FooABC(metaclass=abc.ABCMeta):
... @abc.abstractmethod
... def bar(self):
... pass
...
>>> FooABC.__abstractmethods__
frozenset({'bar'})
>>> class Foo(FooABC): pass
...
>>> Foo()
Traceback (most recent call last):
File "", line 1, in
TypeError: Can't instantiate abstract class Foo with abstract methods bar
Реализация abc.ABCMeta
устанавливает атрибут __abstractmethods__
, а type()
использует его для проверки любых абстрактных методов, которые должны были быть реализованы, но не являются.
Можно использовать этот конфигурационный файл (nlog.config в пути приложения):
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="debugger" xsi:type="Debugger" layout="${logger}::${message}"/>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="debugger" />
</rules>
</nlog>
-Scott