为什么方法接受类名和名称“对象”作为参数?

时间:2018-06-29 19:05:03

标签: python

考虑以下代码,我希望它会产生错误。但这行得通。 #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))

4 个答案:

答案 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.mydef1aVar = MyClass1(); aVar.mydef1并观察结果的差异。

如果您来自C ++或Java之类的语言,这一切似乎都非常令人困惑。但是,它实际上是一个非常规则和逻辑的结构。一切工作方式相同。

而且,正如人们指出的那样,名称没有与之关联的类型。类型与名称所引用的对象相关联。因此,任何名称都可以引用任何事物。这也称为“动态类型”。 Python也以另一种方式动态输入。实际上,您可以弄乱事物的内部结构,也可以更改对象的类型。这是很深的魔术,除非您知道自己在做什么,否则我不建议您这样做。而且即使那样,您也不应该这样做,因为它会使其他人感到困惑。

答案 3 :(得分:0)

任何问题都没有问题-自我是一个与其他对象一样的对象,并且可以在欢迎使用其类型/行为的对象的任何上下文中使用。

Python - Is it okay to pass self to an external function