如何在 Python 中创建对象之前让成员函数处于未确定状态?

How to leave member function undetermined until creation of an object in Python?

我有一个 class 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.__activateActivation。但我不知道如何摆脱它,因为:

  1. 一方面,我想使用key-value原则声明一个对象
  2. 另一方面,需要能够在 class 之外调用方法。

问题:如何让激活函数在声明由 kwarg 确定的对象时才确定?此外,需要能够在 class.

之外调用激活函数

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

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)

这样你的class将默认使用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 

您可以将函数本身作为参数传递

class Node:

    def __init__(self, func)
         self.activation = func

然后当您执行 Node(func).activation() 时,它将 运行 func

我觉得比把函数名作为参数传递更好,后者更容易出错