在我的代码中有一个bug,我使用python中的类并在其中定义了一些函数,但是传递给函数的值不准确
我是python和OOP的初学者。这是我的第一类代码。 我写了下面的python代码,它将运行,代码大约是3个字符串,用户输入它们,代码检查这些字符串是否有效(如果字符串的长度在1到50之间,则字符串有效),但我的代码有一个问题。当我运行代码时,我总是得到默认值。我认为set_字符串函数存在问题。但我不确定。 我将非常感谢您的帮助 代码: 输出2:在我的代码中有一个bug,我使用python中的类并在其中定义了一些函数,但是传递给函数的值不准确,python,Python,我是python和OOP的初学者。这是我的第一类代码。 我写了下面的python代码,它将运行,代码大约是3个字符串,用户输入它们,代码检查这些字符串是否有效(如果字符串的长度在1到50之间,则字符串有效),但我的代码有一个问题。当我运行代码时,我总是得到默认值。我认为set_字符串函数存在问题。但我不确定。 我将非常感谢您的帮助 代码: 输出2: STR1: strin1stringstringstringstringstringstringstringstringstringstringst
STR1: strin1stringstringstringstringstringstringstringstringstringstringstringstringstringstring
string not set since the len is not valid
STR2: string2
String set
STR3: string3
String set
Undefined2 Undefined3
STR1: Sample1
in get_str1 from user, str= Sample1
String set to Sample1
in init, string1= Undefined1
STR2: uduahydaugdadhjksahdjkahsjkdhasjdhjksahdjkashdjksahdjkashjkdsahkjdhjksahdjksad
in get_str2 from user, str= uduahydaugdadhjksahdjkahsjkdhasjdhjksahdjkashdjksahdjkashjkdsahkjdhjksahdjksad
string not set since the len is not valid
STR3: sample3
in get_str3 from user, str= sample3
String set to sample3
in init, string3= Undefined3
Sample1 Undefined2 sample3
但我预计产量为
谢谢
set_string1的更新代码:
def set_string1(self,str1):
if(TripleString.valid_string(str1)):
self.string1=str1
print("String set")
return True
else:
print("string not set since the len is not valid")
return False
def get_string1_from_user():
str=input("STR1:")
if(TripleString.set_string1(str)):
return True
else:
return False
输出:
> STR1: kiarash Traceback (most recent call last): File "python", line
> 71, in <module> File "python", line 8, in __init__ File "python",
> line 32, in get_string1_from_user TypeError: set_string1() missing 1
> required positional argument: 'str1'
>STR1:Traceback(最近一次调用last):文件“python”,第行
>71,在文件“python”的第8行,在_init___文件“python”中,
>第32行,get_string1_from_用户类型错误:set_string1()缺少1
>必需的位置参数:“str1”
您将类绑定变量和函数调用(以TripleString.
开头)与对象绑定变量和调用(以self.
开头)以及局部变量(以零开头)混为一谈
如果可能,您应该使用对象绑定变量和调用。首先需要在每个方法的参数列表(包括\uuuu init\uuu
)前面加上self
参数,如
def set_string1(self, str1):
self.string1 = str1
然后可以设置对象绑定变量,例如
def set_string1(self, str1):
self.string1 = str1
并在另一个功能中引用,例如打印:
print(self.string1)
类绑定变量的合法用法是TripleString.Min\u Len
和TripleString.Max\u Len
(假设它们对于该类的所有对象都相同)
因此,valid\u string(str)
不需要知道特定的对象,可以是类绑定(静态)方法。要声明这一点,请将函数编写为:
@staticmethod
def valid_string(str):
然后,该方法可以被称为
TripleString.valid_string(…)
或甚至可以被称为self.valid_string(…)
,尽管它并不关心特定的对象。您每次都在init上将字符串指定给未定义的对象。你需要在所有def上使用self。我在这里更新了你的代码。
我希望它对你有用
class TripleString:
Max_Len=50
Min_Len=1
def __init__(self,string1="Undefined1",string2="Undefined2",string3="Undefined3"):
if(TripleString.get_string1_from_user(self)):
print("in init, string1=", string1)
else:
self.string1=string1
if(TripleString.get_string2_from_user(self)):
print("in init, string2=", string2)
else:
self.string2=string2
if(TripleString.get_string3_from_user(self)):
print("in init, string3=", string3)
else:
self.string3=string3
def valid_string(self,str):
if(len(str)<TripleString.Min_Len or len(str)>TripleString.Max_Len):
return False
else:
return True
def set_string1(self,str1):
if(self.valid_string(str1)):
self.string1=str1
print("String set to",str1)
return True
else:
print("string not set since the len is not valid")
return False
def set_string2(self,str2):
if(self.valid_string(str2)):
self.string2=str2
print("String set to",str2)
return True
else:
print("string not set since the len is not valid")
return False
def set_string3(self,str3):
if(self.valid_string(str3)):
self.string3=str3
print("String set to",str3)
return True
else:
print("string not set since the len is not valid")
return False
def get_string1_from_user(self):
str=input("STR1:")
print("in get_str1 from user, str=", str)
if(self.set_string1(str)):
return True
else:
return False
def get_string2_from_user(self):
str=input("STR2:")
print("in get_str2 from user, str=", str)
if(self.set_string2(str)):
return True
else:
return False
def get_string3_from_user(self):
str=input("STR3:")
print("in get_str3 from user, str=", str)
if(self.set_string3(str)):
return True
else:
return False
x=TripleString()
print(x.string1,x.string2,x.string3)
输出2:
STR1: strin1stringstringstringstringstringstringstringstringstringstringstringstringstringstring
string not set since the len is not valid
STR2: string2
String set
STR3: string3
String set
Undefined2 Undefined3
STR1: Sample1
in get_str1 from user, str= Sample1
String set to Sample1
in init, string1= Undefined1
STR2: uduahydaugdadhjksahdjkahsjkdhasjdhjksahdjkashdjksahdjkashjkdsahkjdhjksahdjksad
in get_str2 from user, str= uduahydaugdadhjksahdjkahsjkdhasjdhjksahdjkashdjksahdjkashjkdsahkjdhjksahdjksad
string not set since the len is not valid
STR3: sample3
in get_str3 from user, str= sample3
String set to sample3
in init, string3= Undefined3
Sample1 Undefined2 sample3
前面没有
self.
的变量(如string1
)是函数的局部变量(此处:\uuuu init\uuuu
),不能在另一个函数中设置(此处:set\u string…
)。第二个输出不显示第一个字符串,因为您的代码不允许任何超过50个字符的字符串,你知道我该怎么修吗?如何设置字符串1的值和…?谢谢Christiano,我知道,你有办法修复代码吗?谢谢Micheal,我这么做了,但它给了我另一个错误,set_字符串缺少1个参数。我添加了更新的代码,并提出了问题。我在这方面有点初学者python@kiarash只有当set\u string1
是类绑定方法时,调用TripleString.set\u string1(str)
才有效。调用不会传输操作应该在其上发生的特定对象。将其替换为self.set\u string1(str)
。此对象绑定调用在内部转换为类似于TripleString的内容。set_string1(self,str)
其中self
是要对其进行操作的类TripleString
的特定对象。此外,get\u string1\u from\u user
还必须获取一个self
作为参数,并以相同的方式调用。