如何将类的函数变量调用到同一个类的另一个函数中

时间:2017-10-31 00:48:14

标签: python-2.7 python-3.x

在类圈中我是两个函数,我希望在比较方法中使用equals方法的变量self.area_y:

Class circle:
    @classmethod
    def compare(self, circle):
        self.x = circle
        self.area_x = math.pi*self.x*self.x
        #print area_x
        if self.area_x > self.area_y:
            return 1
        elif self.area_x < self.area_y:
            return -1
        elif self.area_x == self.area_y:
            return 0
        else:
            print "Undesired condition met!"

    @classmethod
    def equals(self, circle):
        self.y = circle
        self.area_y = math.pi*self.y*self.y
        return self.area_y

def main():
    circle_r1 = 14.50
    circle_r2 = 14.98
    circle.compare(circle_r1)
    circle.equals(circle_r2)
main()

但是,当我尝试这样做时,我收到以下错误:

File "C:/Users/Deepak/PycharmProjects/Submission/Shapes.py", line 97, in 
compare
if self.area_x > self.area_y:
AttributeError: class circle has no attribute 'area_y'

我应该怎么做才能摆脱这个问题。值得注意的是,我稍后会从主类中调用这两个函数。任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

您需要添加一个init函数(也称为构造函数)。

在init函数内部,您将添加需要在函数之间共享的变量(因此在本例中为self.area和self.radius)。

在下面的代码中,您会注意到在main函数中我正在创建Circle类的多个对象。这就是对象通常的工作方式。每次创建对象时,对象都会获得自己的比较并等于您可以使用的函数。对象也可以为其分配自己的数据。该类只定义了如何创建其对象的说明。您可以谷歌区分两者之间的更多信息。

因此,在您的情况下,您将创建一个新对象var receivedList = [["Name1","Apple","Fresh"],["Name2","Orange","Rotten"],["Name3","Pear","Fresh"],["Name4","Grape","Rotten"]] func filter(keyword: String)-> [[String]] { return receivedList.filter({ (stringArr) -> Bool in for value in stringArr { if value.lowercased().contains(keyword.lowercased()) { return true } } return false }) } var filtered = filter(keyword: searchBar.text ?? "") //Here you will get filtered values ,而不是说Circle.compare(14.50),您将为该对象提供半径。该半径将保存为属于circle1(因为我们告诉init函数保存它)。然后,您可以使用属于circle1 circle1 = Circle(14.50)的函数,而不是circle.compare(14.50)

circle1.compare(circle2)

您可能已经或可能不知道的其他一些项目:

当前对象保存在self变量中,所以当我们说self.radius时,我们讨论的是当前对象的radius变量。

为了区分对象和类,类名通常是大写的,而对象则不是。

一旦我们创建了一个圆形对象import math class Circle: def __init__(self, radius): self.radius = radius self.area = math.pi*radius*radius def compare(self, other): if self.area > other.area: return 1 elif self.area < other.area: return -1 elif self.area == other.area: return 0 else: print("Undesired condition met!") def equals(self, other): return self.area == other.area def main(): circle_r1 = Circle(14.50) circle_r2 = Circle(14.98) print( circle_r1.compare(circle_r2) ) print( circle_r1.equals(circle_r2) ) main() ,就会调用init函数,并且我们的对象会准备好自己的半径和面积变量。

我看到你在使用classmethod装饰器的地方。您通常不需要使用类方法。如果你想更好地理解类方法,我建议先研究staticmethod,然后一旦你理解了静态方法,那就查找classmethod。