代码之家  ›  专栏  ›  技术社区  ›  Nestor Colt

在python中,通过将类方法的方法名保存在for循环的var中来连接到类方法

  •  1
  • Nestor Colt  · 技术社区  · 8 年前

    PyQt4 在同一个函数中,此函数将查找 按钮名称或标题 和a 管理不同操作的实例方法名称。

    instance methods 方法 callback() 无论如何。

    ##############################################
    # Operatios RIG class INSTANCE
    #
    self.OperationsRig = OperationsFile.Operations()
    #### BUTTONS TO CONNECT -----------------------#
    
    mirrorButton.clicked.connect(self.operations_module)
    flipButton.clicked.connect(self.operations_module)
    resetButton.clicked.connect(self.operations_module)
    visibilityButton.clicked.connect(self.operations_module)
    
    def operations_module(self):
        # Text gives me the name to Match ------------------#
        text = self.sender().text()
        # ------------------------#
        # have 3 ways of getting the class instance methods into a list to iterate ..
        method_list = [func for func in dir(self.OperationsRig) if callable(getattr(self.OperationsRig, func))]
        methods = vars(self.OperationsRig.__class__).items()
        member =inspect.getmembers(self.OperationsRig, predicate=inspect.ismethod)
    
        # This var is a list to pass to the Method
        Sel_list = cmds.ls(sl=True)
    
        # iterate over the "self.OperationsRig" methods
        #
        """ option 1 """
        for meth in method_list:
            if text.strip().lower() in meth.lower()[:]:
                # if match, and it does, will call the class method and send the data.
                pass
                #getattr(self.OperationsRig,meth)(Sel_list)  # Executes the funcion instance, but is not
                                                             # sending the data, I've checked printing inside.
                                                             # NoneTypeObject is not iterable. no data sent.
    
        """ option 2 """
        for meth in methods:
            if text.strip().lower() in meth[0].lower()[:]:
                pass
                # if match, and it does, will call the class method and send the data.
                #method = meth[1]   # Gets the memory address of the function. Good.
                #method(Sel_list)   # Does not return anything, the process of the funcion gets an
                                    # error at the very beggining of the method process
    
        """ option 3 """
        for meth in member:
            if text.strip().lower() in meth[0].lower()[:]:
                meth[1](Sel_list)  # Gets the memory address of the function. Good. as a bound method
                                   # Same result as option 1 - # NoneTypeObject is not iterable. no data sent.
    # --------------------------------------------------------------------------------------------------#
    

    匹配进行得很好,问题是调用函数。我做错了什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   kesumu    8 年前

    我不知道OperationsRig类的定义,所以我自己定义了一个。

    因为它可以成功匹配,我认为这不是pyqt的问题。

    这是我的代码:

    class OperationsRig:
        def foo(self, msg):
            print('foo:' + str(msg))
            return 'foo OK'
    
        def foo1(self, msg):
            print('foo1:' + str(msg))
            return 'foo1 OK'
    
    
    opr = OperationsRig()
    
    def operations_module(text):
        # Text gives me the name to Match ------------------#
        # ------------------------#
        # have 3 ways of getting the class instance methods into a list to iterate ..
        method_list = [func for func in dir(opr) if callable(getattr(opr, func))]
    
        # This var is a list to pass to the Method
        Sel_list = [1,2,3]
    
        # iterate over the "self.OperationsRig" methods
        #
        """ option 1 """
        for meth in method_list:
            if text.strip().lower() in meth.lower()[:]:
                # if match, and it does, will call the class method and send the data.
                pass
                return getattr(opr, meth)(Sel_list)  # Executes the funcion instance, but is not
                                                             # sending the data, I've checked printing inside.
                                                             # NoneTypeObject is not iterable. no data sent.
    print(operations_module('foo'))
    print(operations_module('foo1'))
    

    结果如下:

    foo:[1, 2, 3]
    foo OK
    foo1:[1, 2, 3]
    foo1 OK
    
    Process finished with exit code 0
    

    正如我所期望的那样,我仍然不明白为什么你的代码失败了。或者你可以做进一步的解释。