【问题标题】:Python: Self as attributePython:自我作为属性
【发布时间】:2015-04-30 01:39:42
【问题描述】:

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

【问题讨论】:

标签: python methods self


【解决方案1】:

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

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

应该是

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

但是,isProduct() 方法可能无法执行您想要的操作,因为它在处理完第一行的第一列后返回。

在 Python 中,使用 __init__() 方法初始化一个类(必要时)是很正常的。这在官方 Python 文档 tutorial 和 André Laszlo 在 cmets 中链接到您的问题的教程中进行了解释。


而不是做

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

简单地做

return value == look_for

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

【讨论】:

  • 我刚刚更正了我的isProduct() 方法中的returnproblem,以及类内部方法的调用。但是当我用if 测试isProduct() 时,它会显示NameError: global name 'true' is not defined。有什么想法吗?
  • @AmyMagoria:当然!它是True,大写为T;同样False。但是有一个更好的方法可以做到这一点。请参阅我上面添加的示例。
  • 啊。完美的!谢谢你。祝你好运!
【解决方案2】:

您需要一个“World”实例才能从该类外部访问方法:

w = World()
if w.isProduct("K20"):
   #Do something

【讨论】:

    【解决方案3】:

    您已经创建了一个具有实例方法的类,但尚未实例化该类。试试这样:

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

    【讨论】:

      【解决方案4】:

      我认为由于缩进错误,您的最后一个“if”代码不属于您拥有的任何 def,也就是说,如果这意味着在您的课程中。否则你需要将你的类实例化为一个变量来保存一个引用(不要使用类体外部的 self 关键字)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 2018-10-23
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        相关资源
        最近更新 更多