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
.
后循环
我的问题是:当我测试我的 "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
.