【问题标题】:Python Classes Understand methodsPython 类 理解方法
【发布时间】:2021-07-14 15:16:28
【问题描述】:

我有一个简单的任务:我们有类 TestingClass,我们想简单地测试他的方法。我们有用于测试目的的 TestHelper 类。

class TestingClass():
    def testing_method_1(self):
        return False
    def testing_method_2(self):
        return True

class TestHelper():
    def __init__(self, class_name):
      pass
    def add(self, func_name, func_result):
      pass
    def run(self):
      pass
    
helper = TestHelper(TestingClass)
helper.add(“testing_method_1”, False)
helper.add(“testing_method_2”, True)
result = helper.run()

我的目标实现类 TestHelper 的方法。我为自己解决了这个问题,但我认为这是不好的认识。我初始化空字典和测试类。接下来,我将每个方法和测试方法结果添加到字典中。在运行方法中我比较结果。

class TestHelper():
    def __init__(self, class_name):
        self.test_class = class_name()
        self.func_list = {}

    def add(self, func_name, func_result):
        temp = 'self.test_class.' + func_name
        self.func_list[temp] = func_result
        
    def run(self):
        for f in self.func_list.keys():
            if eval(f)() == self.func_list[f]:
                print('yes')
            else:
                print('no')

我能以最好的方式解决它吗?谢谢!

【问题讨论】:

    标签: python class python-class


    【解决方案1】:

    为此目的使用 eval 是多余的。 您可以改为使用 getattr() 函数来检索函数并调用它。 阅读更多:Python Docs

    class TestHelper():
        def __init__(self, class_name):
            self.test_class = class_name()
            self.func_list = {}
    
        def add(self, func_name, func_result):
            # { <function>:<desired result> }
            self.func_list[func_name] = func_result
        
        def run(self):
            for func, desired_result in self.func_list.items():
                if getattr(self.test_class, func)() is desired_result:
                    print('yes')
                else:
                    print('no')
    

    此代码产生结果:

    ...
    >>> helper = TestHelper(TestingClass)
    >>> helper.add("testing_method_1", False)
    >>> helper.add("testing_method_2", True)
    >>> result = helper.run()
    yes
    yes
    

    当然,您还应该测试该类是否甚至具有具有给定函数名称的属性。您可以为此使用hasattr()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多