Python 类 理解方法

问题描述

我有一个简单的任务:我们有类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 的方法。我自己解决了它,但我认为它的实现很糟糕。我初始化空字典和测试类。接下来我将每个方法和测试方法结果添加到字典中。在 run 方法中,我比较了结果。

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

    def add(self,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')

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

解决方法

为此目的使用 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()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...