python如何执行调用从同一对象调用另一个方法的函数的对象方法

时间:2018-06-05 04:15:21

标签: python design-patterns

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

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

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

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:name' dance'未定义

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

期望的输出应该是:

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

1 个答案:

答案 0 :(得分:3)

使用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