【问题标题】:Assign Constructor argument with static method pointer in python?在python中用静态方法指针分配构造函数参数?
【发布时间】:2018-10-03 07:47:10
【问题描述】:

使用下面的程序得到未定义的错误

class SignalHandler(object):  # pylint:  disable=too-few-public-methods
"""
Handles various user generated signals
"""

    def __init__(self,
             sigint_signalhandler=SignalHandler.signal_handler,
             sigquit_signalhandler=SignalHandler.signal_handler,
             sighup_signalhandler=SignalHandler.signal_handler):

        signal.signal(signal.SIGINT, sigint_signalhandler)
        signal.signal(signal.SIGQUIT, sigquit_signalhandler)
        signal.signal(signal.SIGHUP, sighup_signalhandler)

    @staticmethod
    def signal_handler(signalnum):
        print ('Ignoring signal : ', signalnum)

这就是错误的样子

import signalhandler
File "/usr/local/sandvine/scripts/upgrade-assistance/signalhandler.py", line 10, in <module>
class SignalHandler(object):  # pylint:  disable=too-few-public-methods
File "/usr/local/sandvine/scripts/upgrade-assistance/signalhandler.py", line 22, in SignalHandler
sigint_signalhandler=SignalHandler.signal_handler,
NameError: name 'SignalHandler' is not defined

所以最终我想传递一些自定义方法,如果没有,我将使用 SignalHandler 类提供的 signal_handler 方法。

【问题讨论】:

标签: python


【解决方案1】:

将类上方的signal_handler 定义为普通方法,而不是在其内部作为静态方法。你不能在定义之前引用一个类,这就是你的__init__ 正在尝试做的事情。

或者,在 init 正文中使用 self.signal_handler 而不是 SignalHandler.signal_handler

class Foo(object):
    def __init__(self, bar_printer=None):
        self.bar_printer = bar_printer if bar_printer else self._default_bar_printer

    @staticmethod
    def _default_bar_printer():
        print("bar")


f = Foo()
f.bar_printer()  # Prints "bar"

def better_bar_printer():
    print("The best bar!")

f2 = Foo(better_bar_printer)
f2.bar_printer()  # Prints "The best bar!"

【讨论】:

  • 在创建类之后,可以使用SignalHandler.signal_handler = staticmethod(signal_handler)将函数添加到类中。
  • 好的,现在很清楚了。顺便说一句,您可以在__init__ 中使用简化版self.bar_printer = bar_printer or self._default_bar_printer
  • 我个人(可能不公平/不合理)不喜欢为此目的使用or。可能是由于童年时期接触过使用 or 以及具有副作用的函数的 C 构造 :-)
  • 好的,但实际上 Python 中的 or 总是做同样的事情,无论上下文是什么(即,当您将它用于该目的时和在 @987654332 中使用它时,它是相同的@ 子句):or 如果计算结果为 True,则生成左侧,否则生成右侧。所以它和你明确编码的完全一样。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多