代码之家  ›  专栏  ›  技术社区  ›  LRDPRDX

在Python中创建一个对象之前,如何使成员函数不确定?

  •  0
  • LRDPRDX  · 技术社区  · 7 年前

    我有课 Node kwargs .像这样,

    n1 = Node(activation='name_of_activation function')
    

    我有工作的例子,但我不知道我是否遗漏了什么。这是我的代码:

    import math
    
    
    def Signum(x):
        return 1 if x > 0 else 0 
    
    def Sigmoid(x):
        return math.tanh(x) 
    
    def Sin(x):
        return math.sin(x)
    
    
    class Node():
        '''  
        This is class of one node
    
        Each node contains an activation function.
        '''  
        def __init__(self, **kwargs):
            #possible functions
            self.__functions = { 'sgn' : Signum, 'sigmoid' : Sigmoid, 'sin' : Sin }
            self.__activate = self.__functions[kwargs.get('activation', Sigmoid)]                                       
    
         def Activation(self, input_value):
             return self.__activate(input_value)
    
    n1 = Node(activation='sgn')
    n2 = Node(activation='sigmoid')
    n3 = Node(activation='sin')
    print n1.Activation(-1), n2.Activation(-1), n3.Activation(-1)
    

    self.__activate Activation .但我不知道如何摆脱它,因为:

    1. 一方面,我想使用键值原则声明一个对象。

    问题

    2 回复  |  直到 7 年前
        1
  •  1
  •   Netwave    7 年前

    实际上,您可以只传递函数本身,因此您的类将独立于激活函数:

    def Signum(x):
        return 1 if x > 0 else 0 
    
    def Sigmoid(x):
        return math.tanh(x) 
    
    def Sin(x):
        return math.sin(x)
    
    
    class Node():
        '''  
        This is class of one node
    
        Each node contains an activation function.
        '''  
        def __init__(self, activation=Sigmoid):
            #possible functions
            self.__activate = activation                                       
    
         def Activation(self, input_value):
             return self.__activate(input_value)
    

    Sigmoid 默认情况下,还要注意,您可以检查激活函数是否是可调用的:

        def __init__(self, activation=Sigmoid):
            #possible functions
            if not callable(actvation):
                raise ValueError("activation should be a callable function")
            self.__activate = activation 
    

    如果您确实需要在kwargs中传递函数,只需检查您需要的密钥是否在其中:

        def __init__(self, **kwargs):
            #possible functions
            activation = None
            if "activation" in kwargs:
                activation = kwargs["activation"]
            if not callable(actvation):
                raise ValueError("activation should be a callable function")
            self.__activate = activation 
    
        2
  •  1
  •   Dotan    7 年前

    class Node:
    
        def __init__(self, func)
             self.activation = func
    

    那么当你这么做的时候 Node(func).activation() 它将运行 func

    我认为这比将函数名作为参数传递要好,因为参数更容易出错