我的问题是:当我测试我的“isProduct”方法时,我收到错误消息:
TypeError: isProduct() takes exactly 2 arguments (1 given)
所以,我找了这个问题,我发现在调用我的方法之前我必须添加'self'。我做到了。但它仍然说:
NameError: name 'self' is not defined
不介意方法说什么,我的问题涉及属性,类和自我。 这是我的代码,我在做什么(非常)错了?
import xlrd
wb=xlrd.open_workbook('C:\\Inputs_UNF_newForm.xlsx')
s=wb.sheet_by_name('Chemical treatments')
p=wb.sheet_by_name('Products')
class World:
def RowMatrix(self,sheet_name,matrix_name):
sheet=wb.sheet_by_name(sheet_name)
number_of_rows = sheet.nrows
for row in range(number_of_rows):
value = str((sheet.cell(row,0).value))
if value == "#" +matrix_name:
start=row
if value !="":
end=row+1
return (start,end)
def isProduct(self,look_for):
(start,end)= World.RowMatrix("Products","Products")
number_of_columns=p.ncols
for row in range(start,end):
for col in range(number_of_columns):
value = str((sheet.cell(row,col).value))
if value == look_for:
return true
else:
return false
if self.isProduct("K20"):
print("true")
else:
print("false")
答案 0 :(得分:2)
您需要一个“World”实例来访问该类外部的方法:
w = World()
if w.isProduct("K20"):
#Do something
答案 1 :(得分:2)
您已使用实例方法创建了一个类,但尚未实例化该类。试试这样:
my_instance = World()
print(my_instance.isProduct("K20"))
答案 2 :(得分:2)
正如其他人所说,你需要创建一个World
类的实例来在课堂外访问它。在课堂上你通常应该通过self
访问它,而不是通过类名。所以
(start,end)= World.RowMatrix("Products","Products")
可能应该是
start, end = self.RowMatrix("Products", "Products")
但是isProduct()
方法可能无法达到您想要的效果,因为它在处理完第一行的第一列后返回。
在Python中使用__init__()
方法初始化类(必要时)是正常的。这在官方Python文档tutorial和AndréLaszlo在您的问题的评论中链接的教程中进行了解释。
而不是做
if value == look_for:
return True
else:
return False
简单地做
return value == look_for
我之前没有提到这个,因为我怀疑isProduct()
中的逻辑是错误的,因为return
语句意味着该方法突破了那些嵌套的for
循环之后它测试第一个value
。
答案 3 :(得分:1)
我认为你的最后一个" if"由于错误的缩进,代码的某些代码并不属于你所拥有的任何def,即如果那是在你的类中。否则,您需要将类实例化为变量以保存引用(不要在类主体外部使用self关键字)