代码之家  ›  专栏  ›  技术社区  ›  Ohad Dan

Python:传递类函数作为对外部函数的引用

  •  1
  • Ohad Dan  · 技术社区  · 2 年前

    我有一个有几个函数的类。 在该类之外,我想通过引用指定调用哪个函数,但我不确定如何调用。

    例如,我有一个 Animal 具有两个函数的类 sound food .我想要一个 Zoo 类,该类接收 动物 的函数作为输入,并将该函数应用于它所持有的每个动物实例(函数 all_animals_features ).

    class Animal:
        def __init__(self, sound, food):
            self.my_sound = sound
            self.my_food = food
    
        def sound(self):
            # Do some complicated stuff....
            return self.my_sound
    
        def food(self):
            return self.my_food
    
    
    class Zoo():
        def __init__(self, animals):
            self.animals = animals
    
        def all_animals_features(self, f):
            return [animal.f() for animal in self.animals]
    
    dog = Animal('Woof', 'Bone')
    cat = Animal('Meow', 'Cream')
    zoo = Zoo([cat, dog])
    zoo.all_animals_features(Animal.sound)
    

    但当然, 'Animal' object has no attribute 'f' .

    知道如何实现吗?


    澄清:如这个愚蠢的例子所示,如果所需要的只是获得一个属性,那么使用起来可能更简单 getattr() .

    1 回复  |  直到 2 年前
        1
  •  6
  •   quamrana    2 年前

    在您的情况下,您只需要调整方法的调用方式:

    class Zoo():
        def __init__(self, animals):
            self.animals = animals
    
        def all_animals_features(self, f):
            return [f(animal) for animal in self.animals]
    
    dog = Animal('Woof', 'Bone')
    cat = Animal('Meow', 'Cream')
    zoo = Zoo([cat, dog])
    print(zoo.all_animals_features(Animal.sound))
    

    输出

    ['Meow', 'Woof']
    

    既然你提供 Animal.sound ,作为参数 f ,列表理解中的调用是: f(animal)