Python: 自身作为属性

Python: Self as attribute

我的问题是:当我测试我的 "isProduct" 方法时,我收到错误消息:

TypeError: isProduct() takes exactly 2 arguments (1 given)

所以,我查找了这个问题,发现我必须在调用我的方法之前添加 'self'。我做到了。但是,它仍然说:

NameError: name 'self' is not defined

不要介意方法说的是什么,我的问题与属性有关,class 和自我。 这是我的代码,我在做什么(非常)错了?

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")

您需要 "World" 的实例才能从 class:

外部访问方法
w = World()
if w.isProduct("K20"):
   #Do something

您已使用实例方法创建了一个 class,但尚未实例化 class。像这样尝试:

my_instance = World()
print(my_instance.isProduct("K20"))

我认为你的最后 "if" 位代码不属于你的任何定义,因为缩进错误,也就是说,如果它应该在你的 class 中。否则你需要将你 class 实例化为一个变量来保存引用(不要在 class 主体之外使用 self 关键字)

正如其他人指出的那样,您需要创建 World class 的实例才能在 class 之外访问它。在 class 中,您通常应该通过 self 访问它,而不是通过 class 名称。所以

(start,end)= World.RowMatrix("Products","Products")

应该是

start, end = self.RowMatrix("Products", "Products")

然而,isProduct() 方法可能不会执行您想要的操作,因为它 returns 在处理完第一行的第一列之后。

在 Python 中使用其 __init__() 方法初始化 class(必要时)是正常的。这在官方 Python 文档 tutorial 和 André Laszlo 在对您的问题的评论中链接的教程中进行了解释。


而不是

if value == look_for:
    return True
else:
    return False

简单做

return value == look_for

我之前没有提到这个,因为我怀疑isProduct()中的逻辑是错误的,因为return语句意味着该方法会跳出那些嵌套的for在测试第一个 value.

后循环