Python:Self作为属性

时间:2015-02-27 10:58:38

标签: python methods self

我的问题是:当我测试我的“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")

4 个答案:

答案 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关键字)