Python 初始化一个参数为空(None)的函数变量

0 投票
1 回答
502 浏览
提问于 2025-04-18 15:27

显然,我可以犯错,这就是我提这个问题的原因 我不太习惯动态类型的语言,它们没有太多的错误提示。

我想创建一个Python类,这个类里面有一个成员,可以设置为一个接收一个参数的函数指针。

最开始我尝试了(简化的例子)

class MyClass():

  def __init__(self):
    self.__myFunc = None

  # func is a pointer to a function that takes 1 paramater
  def setFunc(self, func):
    self.__myFunc = func

  def getData(self):
    return 42

  def handleData(self):
    data = self.getData()
    if self.__myFunc is not None:
      self.__myFunc(data)


# Separate function not in class
def MyPrint(d)
  print(d)

m = MyClass()
m.setFunc(MyPrint)
m.handleData()

我遇到的第一个问题是 self.__myFunc is not None 在if测试中总是返回False,所以我暂时把它去掉了。

第二个问题是 self.__myFunc(data) 这行代码导致了一个 TypeError: 'NoneType' object is not callable 的错误。根据我查的一个链接 Python中的空函数对象,我把 self.__myFunc = None 改成了 self.__myFunc = lambda: None

但是这个改动导致了一个新的错误 TypeError: <lambda>() takes 0 positional arguments but 1 was given

理想情况下,我希望能做到这一点,而不需要创建一个接收参数但什么都不做的新函数,因为这样看起来很不优雅。

1 个回答

1

你的示例代码里有很多语法错误,而且你写的是一个函数(def MyClass),而不是一个类(class MyClass)。下面是一个可以正常运行的代码版本:

def getData():
  return [1, 2, 3, 4, 5]

class MyClass(object):

  def __init__(self):
    self.__myFunc = None

  # func is a pointer to a function that takes 1 paramater
  def setFunc(self, func):
    self.__myFunc = func

  def handleData(self):
    data = getData()
    if self.__myFunc is not None:
      self.__myFunc(data)

def MyPrint(d):
  print(d)

m = MyClass()
m.setFunc(MyPrint)
m.handleData()

你可以对比一下你写的和我写的,看看有什么不同——有些差别可能很细微。

撰写回答