在类圈中我是两个函数,我希望在比较方法中使用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'
我应该怎么做才能摆脱这个问题。值得注意的是,我稍后会从主类中调用这两个函数。任何帮助都会受到赞赏。
答案 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。