如何使用__new__根据另一个类的实例制作一个类?

boudewijn21

我正在尝试根据另一个类的实例创建一个类。为此,我使用__new__方法:

import logging

class Logger:
    def __new__(cls):
        logger = logging.getLogger('main')

        # make a queue in a thread to put log messages in a PyQt text browser console
        return logger

    def close(self):
        pass
        # close the thread

def main():
    logger = Logger()
    # more things
    logger.close()

if __name__ == '__main__':
    main()

我收到AttributeError:

AttributeError: 'Logger' object has no attribute 'close'

我的想法是制作一个类,以包装从logging.getLogger('main')返回的实例,并能够调用其原始方法(如setLevel)并添加自己的方法。

对于我的问题,日志记录模块的使用并不是至关重要的,但这是我不知道如何在这种情况下使用子类化的一个示例。

我的问题是:

  1. 怎么了?使用该__new__方法时如何进行这项工作
  2. 我一直想更多地这样做。首先这是愚蠢的事情吗?有什么更好的方法?
发光眼

您可能应该将它们子类化:

from logging import Logger

def MyLogger(Logger):

    def close(self):
        pass

if __name__ == "__main__":
    logger = MyLogger("some_name")
    logger.close()

就是说,我不知道您为什么需要手动关闭记录器。他们将在删除对象时处理自己的关闭操作,这在退出Python时也会发生。如果您出于某种原因要半途删除它们,则可以从它们自己的结构中删除它们而没有问题。


PyQt5

OP在一条评论中澄清说,这旨在与PyQt5一起使用。这是过去一年来我一直在使用的东西。

用于显示日志记录的小部件:

# my_package.gui.logwidget.py

from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QTextEdit
from PyQt5.QtCore import QSize

from my_package.logger import handler


class LogWidget(QTextEdit):
    """
    Creates a simple textEdit widget that will automatically subscribe to the QLogger.
    """
    # pylint: disable=R0903, R0201
    def __init__(self, parent=None):
        super().__init__(parent)
        handler.recordReady.connect(self.append)
        self.setReadOnly(True)
        # For reasons mere mortals like me cannot imagine, to get a real Monospaced font,
        # we need to set it on a font that doesn't exist.
        font = QFont("MichaelMcDoesntExist")
        font.setStyleHint(QFont.Monospace)
        self.setFont(font)

    def minimumSizeHint(self) -> QSize:
        return QSize(800, 200)

实际记录器:

# my_package.logger.py

import logging

from PyQt5.QtCore import QObject, pyqtSignal


class QLogHandler(QObject, logging.Handler):
    """
    QObject subclass of logging.Handler. Will emit the log messages so QObjects can listen to it to catch log
    messages.

    Signal:
        recordReady:
            Will emit a string that is the formatted log message.
    """
    recordReady = pyqtSignal(str)

    def emit(self, record):
        self.recordReady.emit(self.format(record))

    def __repr__(self):
        return f"<{self.__class__.__name__} : {logging.getLevelName(self.level)}>"


handler = QLogHandler()  # Global ref to connect to it's signals

Python的内置logging模块已经支持线程安全日志记录对象,因此,要使它起作用,您需要做的就是拥有一个日志处理程序以及任意数量的日志显示小部件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从另一个类访问实例化?

来自分类Dev

如何跟踪一个类中另一个类的实例?

来自分类Dev

创建为实例后,一个类如何从另一个类继承

来自分类Dev

如何在一个类中声明另一个类的实例

来自分类Dev

使用另一个类实例访问一个类方法?

来自分类Dev

在另一个类中使用一个类的实例

来自分类Dev

如何根据另一个类的类型声明一个类

来自分类Dev

如何将一个类的实例方法与另一个实例化?

来自分类Dev

如何将一个类的实例方法与另一个实例化?

来自分类Dev

Java:如何在另一个类中使用在一个类中实例化的对象?

来自分类Dev

如何在另一个生成字节码类中使用匿名类实例

来自分类Dev

如何制作一个 css 类,它是另一个的修改?

来自分类Dev

如何在python中使用另一个实例的类名创建实例?

来自分类Dev

如何通过在Javascript另一个类的实例访问另一个类中的方法

来自分类Dev

一个类包含另一个类的实例时的类设计

来自分类Dev

使用另一个对象的方法实例化一个抽象类?

来自分类Dev

使用另一个对象的方法实例化一个抽象类?

来自分类Dev

在另一个类实例中获取一个类实例的变量的值

来自分类Dev

将一个类实例转换为另一个类的实例

来自分类Dev

如何使用从一个类到另一个类的数据?

来自分类Dev

如何在另一个类中使用一个类?

来自分类Dev

当实例来自另一个类时,如何访问超类的实例?

来自分类Dev

如何使JavaScript类实例成为另一个类的实例?

来自分类Dev

如何在实例化时在新类中创建另一个类的实例?

来自分类Dev

如何使用另一个类中的变量

来自分类Dev

如何从另一个类使用IntDef批注

来自分类Dev

如何使用另一个类类型的数组?

来自分类Dev

如何使用另一个类中的变量

来自分类Dev

如何从另一个类使用IntDef批注

Related 相关文章

  1. 1

    如何从另一个类访问实例化?

  2. 2

    如何跟踪一个类中另一个类的实例?

  3. 3

    创建为实例后,一个类如何从另一个类继承

  4. 4

    如何在一个类中声明另一个类的实例

  5. 5

    使用另一个类实例访问一个类方法?

  6. 6

    在另一个类中使用一个类的实例

  7. 7

    如何根据另一个类的类型声明一个类

  8. 8

    如何将一个类的实例方法与另一个实例化?

  9. 9

    如何将一个类的实例方法与另一个实例化?

  10. 10

    Java:如何在另一个类中使用在一个类中实例化的对象?

  11. 11

    如何在另一个生成字节码类中使用匿名类实例

  12. 12

    如何制作一个 css 类,它是另一个的修改?

  13. 13

    如何在python中使用另一个实例的类名创建实例?

  14. 14

    如何通过在Javascript另一个类的实例访问另一个类中的方法

  15. 15

    一个类包含另一个类的实例时的类设计

  16. 16

    使用另一个对象的方法实例化一个抽象类?

  17. 17

    使用另一个对象的方法实例化一个抽象类?

  18. 18

    在另一个类实例中获取一个类实例的变量的值

  19. 19

    将一个类实例转换为另一个类的实例

  20. 20

    如何使用从一个类到另一个类的数据?

  21. 21

    如何在另一个类中使用一个类?

  22. 22

    当实例来自另一个类时,如何访问超类的实例?

  23. 23

    如何使JavaScript类实例成为另一个类的实例?

  24. 24

    如何在实例化时在新类中创建另一个类的实例?

  25. 25

    如何使用另一个类中的变量

  26. 26

    如何从另一个类使用IntDef批注

  27. 27

    如何使用另一个类类型的数组?

  28. 28

    如何使用另一个类中的变量

  29. 29

    如何从另一个类使用IntDef批注

热门标签

归档