Могу ли я передать функцию в качестве атрибута класса и вызвать ее? - PullRequest
0 голосов
/ 16 января 2020

Могу ли я на самом деле использовать функции другого класса в качестве параметра и атрибута для экземпляра / объекта класса?

Я заметил, что если я делаю что-то подобное, есть много странностей (обратите внимание, что я использую лабораторию Jupyter) :

class ObjectClass:
    #A class; I will insert a function into generalMethod
    def __init__(self, generalMethod):
        self.generalMethod = generalMethod

class GeneralMethods():    
    #Two different methods that I want to call
    def method1(self):
        add(2)
    def method2(self):
        print("Hey now, you're an all-star, get your game on, go play" )
        return "Hey, I can return stuff, at least!",2

def add(input):
    #A simple function that adds 1 to input
    print(1 + input)

#Creating two objects with different methods as inputs from GeneralMethods
gm = GeneralMethods()
object1 = ObjectClass(gm.method1())
object2 = ObjectClass(gm.method2())

#Attempting to call anything from generalMethod; a getter method does the same
object1.generalMethod
object2.generalMethod

gm.method1() и gm.method2() делает все внутри него, даже , когда я просто объявляю его как параметр объекта / экземпляра!

Но anyObject.generalMethod ничего не делает кроме возвращает то, что находится в возврате, когда я его вызываю, и если там есть функция, она возвращает None.

Так могу ли я фактически вызывает функцию из атрибута, и она работает так же, как gm.method1 () при вызове ее из атрибута (anyObjectIChoose.generalMethod).

1 Ответ

1 голос
/ 16 января 2020

Вы можете передать функцию в качестве параметра:

def foo():
    print('hello')

def bar(_f):
    _f()

bar(_f=foo)
'hello'

Обратите внимание, что когда вы добавляете () к имени функции, вы вызываете ее. Чтобы передать в качестве параметра вам нужно просто имя, а не вызывать его.

...