我想使用Mixin总是为我的子类添加一些init功能,每个类继承自不同的API基类.具体来说,我想创建多个不同的子类,这些子类继承自这些不同的API提供的基类之一和一个Mixin,它将始终以相同的方式执行Mixin初始化代码,而无需代码复制.但是,似乎不会调用Mixin类的__init__函数,除非我在Child类的__init__函数中显式调用它,这不是理想的.我建立了一个简单的测试用例:
class APIBaseClassOne(object):
def __init__(self, *args, **kwargs):
print (" base ")
class SomeMixin(object):
def __init__(self, *args, **kwargs):
print (" mixin before ")
super(SomeMixin, self).__init__(*args, **kwargs)
print (" mixin after ")
class MyClass(APIBaseClassOne):
pass
class MixedClass(MyClass, SomeMixin):
pass
Run Code Online (Sandbox Code Playgroud)
正如您在以下输出中所看到的,Mixin函数的init永远不会被调用:
>>> import test
>>> test.MixedClass()
base
<test.MixedClass object at 0x1004cc850>
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点(在调用Mixin时有一个init函数)而不编写每个子类来显式调用Mixin的init函数?(即,不必在每个班级做这样的事:)
class MixedClass(MyClass, SomeMixin):
def __init__(*args, **kwargs):
SomeMixin.__init__(self, *args, **kwargs)
MyClass.__init__(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果我所有的子类都继承自相同的基类,我意识到我可以创建一个继承自基类和mixin的新中间类,并保持干燥.但是,它们从具有共同功能的不同基类继承.(准确地说是Django Field类).
我正在尝试破译日志中包含的信息(日志记录设置使用默认格式化程序).该文件规定:
对记录进行格式化 - 如果设置了格式化程序,请使用它.否则,请使用模块的默认格式化程序.
但是,我找不到任何实际说明这种默认格式的引用.
我用来dictConfig设置日志记录。simpleFormatter我的要求之一是将格式化程序的默认转换器(我对所有处理程序使用单个格式化程序)更改为time.gmtime. 这将像这样完成:
formatter.converter = time.gmtime
Run Code Online (Sandbox Code Playgroud)
如果我有权访问格式化程序。但我不这样做,所以我无法更改默认转换器。我可以想到两种方法来做我想做的事:
dictConfig通过, 在部分中传递相关参数formatters(类似'converter': 'ext://time.gmtime')但我认为这个额外的参数不支持dictConfigdictConfig并手动应用配置:formatter.converter = time.gmtime。我不知道如何按名称获取格式化程序,也不知道它是否受支持,或者是否会绕过模块logging.config。在查看了日志记录模块的源代码后,我既没有找到示例,也没有找到文档,也没有找到实现此目的的方法。
有人设法formatter.converter使用 dictConfig 设置来设置吗?