考虑以下代码,我希望它会产生错误。但这行得通。 #include <stdlib.h>
#include "functions.h"
#include "math.h"
double applySigmoid(double weightedSum) {
double eToWSum = pow(M_E, weightedSum);
return eToWSum / (eToWSum + 1);
}
double applySigmoidDerivative(double activationValue) {
return activationValue * (1 - activationValue);
}
double applyReLU(double weightedSum) {
return weightedSum < 0 ? 0 : weightedSum;
}
double applyReLUDerivative(double activationValue) {
return activationValue == 0 ? 0 : 1;
}
double applyTanH(double weightedSum) {
return 2 * applyReLU(2 * weightedSum) - 1;
}
double applyTanHDerivative(double activationValue) {
return 1 - pow(activationValue, 2);
}
double getInitialXavierWeight(double previousLayerSize, double layerSize) {
return sqrt(2 / previousLayerSize);
}
double getInitialRandomWeight(double previousLayerSize, double layerSize) {
return ((double) rand() / RAND_MAX) * 0.01;
}
double getInitialBias(double previousLayerSize, double layerSize) {
return 0;
}
double getCost(double neuronValue, double intendedValue) {
double difference = neuronValue - intendedValue;
return 0.5 * pow(difference, 2);
}
double getCostDerivative(double neuronValue, double intendedValue) {
return neuronValue - intendedValue;
}
仅应以MyClass1实例作为参数来调用,但它接受mydef1(self)
以及模糊的MyClass1
作为实例。
有人可以解释为什么mydef接受类名(object
)和MyClass1
作为参数吗?
object
输出
class MyClass1:
def mydef1(self):
return "Hello"
print(MyClass1.mydef1(MyClass1))
print(MyClass1.mydef1(object))
答案 0 :(得分:1)
Python不是静态类型的语言,因此只要传递正确数量的参数,并且可以将任何数据类型的任何对象传递给任何函数,并且类方法中的self
自变量是与其他函数中的参数没有什么不同。
答案 1 :(得分:1)
Python是动态类型的,因此它不在乎传递了什么。它只在乎单个必需的参数将参数作为值。一旦进入函数,就不再使用self
,因此参数是什么都无关紧要;您一开始就不能滥用您不使用的东西。
之所以会出现此问题,是因为您采取了一种不常见的操作:将实例方法作为带有显式参数的未绑定方法运行,而不是在类的实例上调用它,而让Python运行时系统负责传递该实例作为mydef1
的第一个参数:MyClass().mydef1() == MyClass.mydef1(MyClass())
。
答案 2 :(得分:1)
这个问题的答案有几个部分,因为您的问题表明人们对Python的几个不同方面感到困惑。
首先,类型名称在Python中并不特殊。它们只是另一个变量。您甚至可以做类似object = 5
的事情,并引起各种混乱。
第二,self
参数就是那个参数。当您说MyClass1.mydef1
时,您是在变量中要求名称为mydef1
的变量的值(这是一个模块或类,或者定义了__getattr__
方法的其他内容) MyClass1
。您会得到一个带有一个参数的函数。
如果您这样做:
aVar = MyClass1()
aVar.mydef1(object)
它会失败。当Python从类的实例获取方法时,该实例的__getattr__
方法具有特殊的魔力,可以将第一个参数绑定到从中检索该方法的同一对象。然后,它返回bound方法,该方法现在减少了一个参数。
我建议您摆弄一下解释器并输入MyClass1定义,然后输入MyClass1.mydef1
和aVar = MyClass1(); aVar.mydef1
并观察结果的差异。
如果您来自C ++或Java之类的语言,这一切似乎都非常令人困惑。但是,它实际上是一个非常规则和逻辑的结构。一切工作方式相同。
而且,正如人们指出的那样,名称没有与之关联的类型。类型与名称所引用的对象相关联。因此,任何名称都可以引用任何事物。这也称为“动态类型”。 Python也以另一种方式动态输入。实际上,您可以弄乱事物的内部结构,也可以更改对象的类型。这是很深的魔术,除非您知道自己在做什么,否则我不建议您这样做。而且即使那样,您也不应该这样做,因为它会使其他人感到困惑。
答案 3 :(得分:0)
任何问题都没有问题-自我是一个与其他对象一样的对象,并且可以在欢迎使用其类型/行为的对象的任何上下文中使用。