如何在 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.__activate
和 Activation
。但我不知道如何摆脱它,因为:
- 一方面,我想使用key-value原则声明一个对象
- 另一方面,需要能够在 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
。
我觉得比把函数名作为参数传递更好,后者更容易出错
我有一个 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.__activate
和 Activation
。但我不知道如何摆脱它,因为:
- 一方面,我想使用key-value原则声明一个对象
- 另一方面,需要能够在 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
。
我觉得比把函数名作为参数传递更好,后者更容易出错