在Python中从另一个函数调用变量

在Python中从另一个函数调用变量,python,Python,在过去的几个小时里,我一直在四处阅读,但我并不真正理解一个非常基本的概念:将值作为变量在不同的函数之间传递 class BinSearch: def __init__(self,length,leng,r,obj_function,middle): self.length = length self.leng = leng self.r = r self.obj_function = obj_function

在过去的几个小时里,我一直在四处阅读,但我并不真正理解一个非常基本的概念:将值作为变量在不同的函数之间传递

class BinSearch:
    def __init__(self,length,leng,r,obj_function,middle):
        self.length = length
        self.leng = leng
        self.r = r
        self.obj_function = obj_function
        self.middle = middle
        self.objtobin(obj_function)

    def BinarySearch(length,leng,r):
        mid = np.arange(0,len(length),1)
        middle = min(mid) + (max(mid)-min(mid))//2
        L_size = []
        L = length[middle]
        L_size.append(L)
        return L

    def objtobin(self,obj_function):
        # length,leng,middle = BinSearch.BinarySearch()
        if (obj_function>=0.98):
            return BinSearch.BinarySearch(self.length,min(leng),self.middle-1)
        else:
            return BinSearch.BinarySearch(self.length,self.middle+1,max(leng))
BinSearch.objtobin(obj_function=max(objectivelist))
当我运行上述代码时,BinSearch.objtobin代码为objtobin提供了缺少1个必需的位置参数:“self”我应该如何处理此错误? 谢谢你的帮助


首先,感谢大家的帮助。但我不明白该如何更改此代码

我已经开始修改您的代码,使其能够无错误地运行,但其中也有一些其他错误,我还没有尝试理解您的所有参数

看起来像这样,但我会在下面解释

-OP的尝试失败了-- BinSearch.objtobinobj_函数=maxobjectivelist - - - - - - - - - - - -使用实例-- 计算出你自己=100 这个变量是我必须提供的任何参数的占位符 myBinSearchInstance=BinSearch 长度=自己算出这个, 冷=[你自己想出来], r=你自己想出来, obj_函数=你自己计算出来, 中间=你自己想出来 myBinSearchInstance.objtobinobj_函数=maxobjectivelist 这里有一个重要的概念需要掌握:自我

让我们考虑一下这里的简单示例函数,它总是输出比上一个大的数字。

计数器=0 定义我们的_功能: 全局计数器 计数器=计数器+1 返回计数器 printour_函数 虽然可以,但它使用一个全局变量来跟踪其状态。想象一下,将它同时用于两个不同的目的。那将是一片混乱! 因此,我们将其打包到一个类中

未完成进近 计数器=0 课程类别: 这称为静态方法 定义我们的_功能: 全局计数器 计数器=计数器+1 返回计数器 printour_函数 当我们试图运行这个时,我们遇到了一个问题

NameError:name未定义我们的函数

这是因为它现在只能在该类中访问。所以我们需要称之为

printOurClass.our_函数 这使得使用相同名称的函数是可以的——只要它们在不同的类中——但这并不能解决一次多次使用_函数所带来的混乱。我们想要的基本上是有两个独立的计数器变量。这就是实例发挥作用的地方:当然,我们可以手动创建使用第二个全局变量的第二个函数,但当您越来越多地使用它时,它很快就会失控

让我们在班里移动计数器

课程类别: 计数器=0 定义我们的_功能: 全局计数器 计数器=计数器+1 返回计数器 您猜对了-现在不再定义计数器:

NameError:未定义名称计数器

因此,让我们将要使用的实例变量作为参数传递到函数中。然后使用该实例获取其计数器:

课程类别: 计数器=0 将我们的_函数定义为_实例: _instance.counter=_instance.counter+1 返回_instance.counter myInstance=OurClass mySecondInstance=OurClass printOurClass.our_函数MyInstance printOurClass.our_函数mysecondInstance 并且成功地,两个打印语句都打印1

但这有点烦人,因为这个_实例与其他参数不同。为了使它与众不同,python允许我们避免使用第一个参数,而是将其作为接收器提供。这两项工作:

printmyInstance.our_函数 printOurClass.our_函数mysecondInstance Python对这些参数使用非常强大的约定。与其使用_实例,不如将其称为self。看

课程类别: 计数器=0 定义我们的功能自身: self.counter=self.counter+1 返回自动计数器 myInstance=OurClass mySecondInstance=OurClass printmyInstance.our_函数 printmySecondInstance.our_函数 现在我们差不多完成了!只剩下一件事需要了解:init的参数从何而来? 它们从我们构造它的那一行传递到uuu init。因此,让我通过为计数器添加一个起始值来演示:

课程类别: 计数器=0 定义初始自我,起始值: self.counter=起始值 定义我们的功能自身: self.counter=self.counter+1 返回自动计数器 myInstance=OurClass5 mySecondInstance=OurClass10 printmyInstance.our_函数 printOurClass.our_函数mysecondInstance 这张照片是6号和11号

但是这些注释对@staticmethod意味着什么呢?为此,请参见和。 简而言之:您可以使用@staticmethod或@classmethod注释类中的任何方法

@staticmethod意味着可以像myInstance.foo一样在OurClass.foo调用时调用它 不要将self作为参数。没有这个装饰器,您只能将其称为OurClass.foo,而不能称为myInstance.foo。 @classmethod意味着可以像myInstance.foo一样调用它,它不获取myInstance作为第一个参数,而是获取myInstance的类,即我们的类。这允许你,例如,去。此外,当您对类方法进行子类化时,它不会被继承,因此不会被错误调用。 评论指出,您还可以使用@staticmethod并避免创建实例。为此,您不必在类本身中使用任何变量——但无论如何,您不会长时间使用这些变量,因此您可以将它们作为参数传递给函数


首先,感谢大家的帮助。但我不明白该如何更改此代码

我已经开始修改您的代码,使其能够无错误地运行,但其中也有一些其他错误,我还没有尝试理解您的所有参数

看起来像这样,但我会在下面解释

-OP的尝试失败了-- BinSearch.objtobinobj_函数=maxobjectivelist - - - - - - - - - - - -使用实例-- 计算出你自己=100 这个变量是我必须提供的任何参数的占位符 myBinSearchInstance=BinSearch 长度=自己算出这个, 冷=[你自己想出来], r=你自己想出来, obj_函数=你自己计算出来, 中间=你自己想出来 myBinSearchInstance.objtobinobj_函数=maxobjectivelist 这里有一个重要的概念需要掌握:自我

让我们考虑一下这里的简单示例函数,它总是输出比上一个大的数字。

计数器=0 定义我们的_功能: 全局计数器 计数器=计数器+1 返回计数器 printour_函数 虽然可以,但它使用一个全局变量来跟踪其状态。想象一下,将它同时用于两个不同的目的。那将是一片混乱! 因此,我们将其打包到一个类中

未完成进近 计数器=0 课程类别: 这称为静态方法 定义我们的_功能: 全局计数器 计数器=计数器+1 返回计数器 printour_函数 当我们试图运行这个时,我们遇到了一个问题

NameError:name未定义我们的函数

这是因为它现在只能在该类中访问。所以我们需要称之为

printOurClass.our_函数 这使得使用相同名称的函数是可以的——只要它们在不同的类中——但这并不能解决一次多次使用_函数所带来的混乱。我们想要的基本上是有两个独立的计数器变量。这就是实例发挥作用的地方:当然,我们可以手动创建使用第二个全局变量的第二个函数,但当您越来越多地使用它时,它很快就会失控

让我们在班里移动计数器

课程类别: 计数器=0 定义我们的_功能: 全局计数器 计数器=计数器+1 返回计数器 您猜对了-现在不再定义计数器:

NameError:未定义名称计数器

因此,让我们将要使用的实例变量作为参数传递到函数中。然后使用该实例获取其计数器:

课程类别: 计数器=0 将我们的_函数定义为_实例: _instance.counter=_instance.counter+1 返回_instance.counter myInstance=OurClass mySecondInstance=OurClass printOurClass.our_函数MyInstance printOurClass.our_函数mysecondInstance 并且成功地,两个打印语句都打印1

但这有点烦人,因为这个_实例与其他参数不同。为了使它与众不同,python允许我们避免使用第一个参数,而是将其作为接收器提供。这两项工作:

printmyInstance.our_函数 printOurClass.our_函数mysecondInstance Python对这些参数使用非常强大的约定。与其使用_实例,不如将其称为self。看

课程类别: 计数器=0 定义我们的功能自身: self.counter=self.counter+1 返回自动计数器 myInstance=OurClass mySecondInstance=OurClass printmyInstance.our_函数 printmySecondInstance.our_函数 现在我们差不多完成了!只剩下一件事需要了解:init的参数从何而来? 它们从我们构造它的那一行传递到uuu init。因此,让我通过为计数器添加一个起始值来演示:

课程类别: 计数器=0 定义初始自我,起始值: self.counter=起始值 定义我们的功能自身: self.counter=self.counter+1 返回自动计数器 myInstance=OurClass5 mySecondInstance=OurClass10 printmyInstance.our_函数 printOurClass.our_函数mysecondista nce 这张照片是6号和11号

但是这些注释对@staticmethod意味着什么呢?为此,请参见和。 简而言之:您可以使用@staticmethod或@classmethod注释类中的任何方法

@staticmethod意味着当OurClass.foo不将self作为参数时,可以像myInstance.foo一样调用它。没有这个装饰器,您只能将其称为OurClass.foo,而不能称为myInstance.foo。 @classmethod意味着可以像myInstance.foo一样调用它,它不获取myInstance作为第一个参数,而是获取myInstance的类,即我们的类。这允许你,例如,去。此外,当您对类方法进行子类化时,它不会被继承,因此不会被错误调用。
评论指出,您还可以使用@staticmethod并避免创建实例。为此,您不必在类本身中使用任何变量,但无论如何,您不会长时间使用这些变量,因此您可以将它们作为参数传递给函数。

objtobin是一种实例方法。你应该为你的类创建一个实例,并用它来调用这个方法。我会先给你答案,然后寻找重复的,以便以后更好地解释:因为objtobin需要self,所以你需要在实例上调用它,而不是在类上。创建一个实例bs=BinSearchlength,leng,r,objfunction,middle,然后像bs.objtobin一样调用它……我没有发现一个完全相同的问题,这让我感到惊讶。首先,谢谢大家的帮助。但我不明白该如何更改此代码。你能@lucidbrot帮助我吗?这是否是类中@staticmethod decorator的一个用例,以便可以在外部调用该函数?据我所知,这方面的问题是objtobin函数使用自变量进行返回,使其与对象实例共同依赖。objtobin是一种实例方法。你应该为你的类创建一个实例,并用它来调用这个方法。我会先给你答案,然后寻找重复的,以便以后更好地解释:因为objtobin需要self,所以你需要在实例上调用它,而不是在类上。创建一个实例bs=BinSearchlength,leng,r,objfunction,middle,然后像bs.objtobin一样调用它……我没有发现一个完全相同的问题,这让我感到惊讶。首先,谢谢大家的帮助。但我不明白该如何更改此代码。你能@lucidbrot帮助我吗?这是否是类中@staticmethod decorator的一个用例,以便可以在外部调用该函数?据我所知,这方面的问题是objtobin函数使用自变量进行返回,使其与对象实例共同相关。