Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我的代码中有一个bug,我使用python中的类并在其中定义了一些函数,但是传递给函数的值不准确_Python - Fatal编程技术网

在我的代码中有一个bug,我使用python中的类并在其中定义了一些函数,但是传递给函数的值不准确

在我的代码中有一个bug,我使用python中的类并在其中定义了一些函数,但是传递给函数的值不准确,python,Python,我是python和OOP的初学者。这是我的第一类代码。 我写了下面的python代码,它将运行,代码大约是3个字符串,用户输入它们,代码检查这些字符串是否有效(如果字符串的长度在1到50之间,则字符串有效),但我的代码有一个问题。当我运行代码时,我总是得到默认值。我认为set_字符串函数存在问题。但我不确定。 我将非常感谢您的帮助 代码: 输出2: STR1: strin1stringstringstringstringstringstringstringstringstringstringst

我是python和OOP的初学者。这是我的第一类代码。 我写了下面的python代码,它将运行,代码大约是3个字符串,用户输入它们,代码检查这些字符串是否有效(如果字符串的长度在1到50之间,则字符串有效),但我的代码有一个问题。当我运行代码时,我总是得到默认值。我认为set_字符串函数存在问题。但我不确定。 我将非常感谢您的帮助

代码:

输出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
但我预计产量为

谢谢

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
作为参数,并以相同的方式调用。