首页 > 解决方案 > python如何执行调用从同一对象调用另一个方法的函数的对象方法

问题描述

有一个名为start_party的函数,它不属于任何类,它是一个打印音乐的独立函数,告诉派对参与者做一些有趣的事情,比如跳舞或唱歌。

一个可以像派对参与者一样适应,它有两种状态:进入连接和脱离连接。可以告诉一个人根据外部功能执行一个动作(方法);因此,当人执行动作时,它首先会感觉到内部的联系,并以要求实现的任何方法参与到外部功能中。外部功能停止(开始派对结束......),因此 Person 感觉与这个令人难以置信的时刻脱节,因为它通过打印让我们知道。

所有这些经验的实现如下:

class Feeling():
    def __init__(self):
        self.data_in = 'into connection'
        self.data_out = 'out of connection'


class Person():
    def __init__(self):
        self.feeling = Feeling()

    def execute(self, outer_function, inner_function):
        print(self.feeling.data_in)
        outer_function(self, inner_function)
        print(self.feeling.data_out)

    def dance(self):
        print(' └[∵┌]└[ ∵ ]┘[┐∵]┘ ')

    def sing(self):
        print('( ◜◒◝ )')


def start_party(party_participant, inner_function):
    print('♬♩♪♩')
    party_participant.inner_function()
    print('♬♩♪♩')


liz = Person()
liz.execute(start_party, dance)

我最好的尝试并没有编译,它给了我一个:

NameError:名称“舞蹈”未定义

但主要问题仍然不是编译,而是设计。(虽然我也需要修复编译。)

期望的输出应该是:

into connection
♬♩♪♩
└[∵┌]└[ ∵ ]┘[┐∵]┘
♬♩♪♩
out of connection

标签: pythondesign-patterns

解决方案


用于getattr()让类方法执行如下:

代码:

def start_party(party_participant, inner_function):
    print('♬♩♪♩')
    getattr(party_participant, inner_function)()
    print('♬♩♪♩')

测试代码:

class Feeling():
    def __init__(self):
        self.data_in = 'into connection'
        self.data_out = 'out of connection'


class Person():
    def __init__(self):
        self.feeling = Feeling()

    def execute(self, outer_function, inner_function):
        print(self.feeling.data_in)
        outer_function(self, inner_function)
        print(self.feeling.data_out)

    def dance(self):
        print(' └[∵┌]└[ ∵ ]┘[┐∵]┘ ')

    def sing(self):
        print('( ◜◒◝ )')


def start_party(party_participant, inner_function):
    print('♬♩♪♩')
    getattr(party_participant, inner_function)()
    print('♬♩♪♩')


liz = Person()
liz.execute(start_party, 'dance')

结果:

into connection
♬♩♪♩
 └[∵┌]└[ ∵ ]┘[┐∵]┘ 
♬♩♪♩
out of connection

推荐阅读