Python 使用面向对象的方法传递函数作为参数的等效方法是什么

Python 使用面向对象的方法传递函数作为参数的等效方法是什么,python,oop,first-class-functions,Python,Oop,First Class Functions,我有一个python程序,其中包含一个类,该类将函数作为\uuuu init\uuu方法的参数。此函数作为属性存储,并在类中的不同位置使用。传入的函数可能有很大的不同,传入一个键,然后从一组预定义函数中进行选择不会提供相同程度的灵活性 现在,如果一长串这样的问题不酷,我道歉,但是 在函数不是第一类对象的语言中,它们是实现这一点的标准方法吗 在这方面,模块(如smalltalk或objective-C)算是函数吗 在这些语言中,块是实现这一点的最佳方式吗 如果没有街区怎么办 能否在运行时添加新方

我有一个python程序,其中包含一个类,该类将函数作为
\uuuu init\uuu
方法的参数。此函数作为属性存储,并在类中的不同位置使用。传入的函数可能有很大的不同,传入一个键,然后从一组预定义函数中进行选择不会提供相同程度的灵活性

现在,如果一长串这样的问题不酷,我道歉,但是

  • 在函数不是第一类对象的语言中,它们是实现这一点的标准方法吗
  • 在这方面,模块(如smalltalk或objective-C)算是函数吗
  • 在这些语言中,块是实现这一点的最佳方式吗
  • 如果没有街区怎么办
  • 能否在运行时添加新方法
  • 在哪种语言中这是可能的(并且很容易)
  • 或者用一个方法创建一个对象来执行所需的操作会更好吗
  • 如果我想传递很多函数,我会创建很多单例对象吗
  • 这会被认为是一种更面向对象的方法吗
  • <> Ly>有人会在Python中这样做吗?函数是第一类对象?
      我只想回答你的一些问题

      正如他们在Scheme社区中所说,“对象是穷人的闭包”(闭包是一级函数)。块通常只是闭包的语法糖。对于没有闭包的语言,存在各种解决方案

      一个常见的解决方法是使用运算符重载:C++有一个函数对象的概念,它定义了一个成员<代码>操作程序()/<代码>(“操作符函数调用”)。Python有一个类似的重载机制,您可以在其中定义

      \uuuuu调用

      class Greeter(object):
          def __init__(self, who):
               self.who = who
      
          def __call__(self):
               print("Hello, %s!" % who)
      
      hello = Greeter("world")
      hello()
      

      是的,您可以考虑在Python中使用这个函数,而不是在对象中存储函数,因为函数不能。


      在没有运算符重载的语言中,您将看到类似Guava的界面。

      我将回答您的一些问题

      正如他们在Scheme社区中所说,“对象是穷人的闭包”(闭包是一级函数)。块通常只是闭包的语法糖。对于没有闭包的语言,存在各种解决方案

      一个常见的解决方法是使用运算符重载:C++有一个函数对象的概念,它定义了一个成员<代码>操作程序()/<代码>(“操作符函数调用”)。Python有一个类似的重载机制,您可以在其中定义

      \uuuuu调用

      class Greeter(object):
          def __init__(self, who):
               self.who = who
      
          def __call__(self):
               print("Hello, %s!" % who)
      
      hello = Greeter("world")
      hello()
      

      是的,您可以考虑在Python中使用这个函数,而不是在对象中存储函数,因为函数不能。


      在没有运算符重载的语言中,您将看到类似Guava的界面。

      您可以使用。基本上,传入一个具有已知接口但行为不同的对象。它类似于传递函数,但它被包装在一个对象中

      您可以使用。基本上,传入一个具有已知接口但行为不同的对象。它类似于传递函数,但它被包装在一个对象中

      我不明白你所说的“等效……使用面向对象的方法”是什么意思。在Python中,既然函数是(正如您所说的)一级对象,那么将函数作为参数传递怎么不是“面向对象的”

      在函数不是第一类对象的语言中实现这一点的标准方法是什么

      我想说的是,只有在某种程度上,函数的标准方式不能成为一级对象

      <>在C++中,通常创建另一个类,通常称为函子或函数,它定义了<>代码>操作程序()/>代码的重载,允许实例像语法一样使用函数。然而,通常也可以使用普通的旧函数指针。指针和指针函数都不是一级对象,但接口足够丰富

      这与通过模板实现的“特殊多态性”很好地吻合;您可以编写实际上并不关心是否传递类实例或函数指针的函数

      类似地,在Python中,您可以通过为类定义
      \uuuu调用
      方法,将对象注册为可调用

      在这方面,模块(如smalltalk或objective-C)算是函数吗

      我想说是的。在Python中,lambda至少和函数一样重要,实际上更重要,因为它们不像Python中的lambda那样被削弱

      在这些语言中,块是实现这一点的最佳方式吗

      这取决于你需要什么

      能否在运行时添加新方法?在哪种语言中这是可能的(并且很容易)

      为自己的编译器提供内省和运行时访问的语言。Python是合格的

      然而,到目前为止,这个问题并没有表现出来,这表明有必要跳过这样的障碍。当然,对于一个新类,有些语言比其他语言需要更多的样板文件

      或者用一个方法创建一个对象来执行所需的操作会更好吗

      这是相当标准的

      如果我想传递很多函数,我会创建很多单例对象吗


      您这样说,就好像如果不编写成吨的样板来阻止自己这样做,您可能会意外地创建多个类实例

      这会被认为是一种更面向对象的方法吗

      同样,我无法理解你对“面向对象”这个术语的理解。这并不意味着“创建大量对象”

      有人会在Python中这样做,函数是第一类对象吗?< /P> 并非不需要类可以做而函数不能做的额外事情。与d