尝试在另一个函数中使用一个函数的 return 值,但得到的是未定义的变量
Trying to use the return value from one function in another but getting undefined variable instead
我有这个代码:
class Pet(object):
def __init__(self,name=""):
self.name = name
self.kind = "Unknown"
self.toys = []
def add_toys(self,toys):
new_list = []
for toy in self.toys:
if toy not in new_list:
new_list.append(toy)
return new_list
def __str__(self):
toys_list = add_toys(self,toys)
if self.toys == []:
return "{} is a {} that has no toys".format(self.name,self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name,self.kind,toys_list)
在函数 add_toys()
中,我有 return 值 new_list。
我想在函数 __ str__
中使用那个 return 值并将其定义为 toys_list
。
但是,当我写 toys_list = add_toys(self, toys)
时,它说:
add_toys
is an undefined variable
不能直接调用class方法,必须使用self调用。
像这样..
self.toys_list= self.add_toys(self, toys)
在 add_toys 中的第一件事是从 class 级别变量访问玩具变量,因此删除该参数,第二个是 add_toys(self,toys)
语法不正确,您需要像 self.add_toys()
一样使用它
class Pet(object):
def __init__(self,name=""):
self.name = name
self.kind = "Unknown"
self.toys = []
def add_toys(self):
new_list = []
for toy in self.toys:
if toy not in new_list:
new_list.append(toy)
return new_list
def __str__(self):
toys_list = self.add_toys()
if self.toys == []:
return "{} is a {} that has no toys".format(self.name, self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name, self.kind, toys_list)
选择:
class Pet(object):
def __init__(self,name=""):
self.name = name
self.kind = "Unknown"
self.toys = []
def add_toys(self, toys):
new_list = []
for toy in toys:
if toy not in new_list:
new_list.append(toy)
return new_list
def __str__(self):
toys_list = self.add_toys(self.toys)
if self.toys == []:
return "{} is a {} that has no toys".format(self.name, self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name, self.kind, toys_list)
你的 add_toys
方法不好,你没有使用 toys
参数,它不应该 return 任何东西,它应该像
class Pet:
# __init__ is OK
def add_toys(self, *toys):
for toy in toys:
if toy not in self.toys:
self.toys.append(toy)
def __str__(self):
if not self.toys:
return "{} is a {} that has no toys".format(self.name, self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name, self.kind, self.toys)
像这样使用
p = Pet("Foo")
p.add_toys("ball")
p.add_toys("plate", "frisbee")
print(p) # Foo is a Unknown that has the following toys: ['ball', 'plate', 'frisbee']
你可以直接使用一个set
class Pet:
def __init__(self, name, kind="Unknown"):
self.name = name
self.kind = kind
self.toys = set()
def add_toys(self, *toys):
self.toys.update(toys)
问题是未定义的 函数。缺少引用 self(每个 class 成员、字段或方法都需要):
toys_list = self.add_toys()
.
重新考虑设计
为什么 toys 的 collection 管理了两次?
(a) 作为可以重复的字段 toys
,
(b) as return from add_toys
这将隐藏重复项并确保唯一元素。
您必须保持两者同步。它们的功能不同,应适用于不同的 use-cases.
假设:独特的玩具
我也会直接使用 set 作为字段 toys
的类型。因为通过这种方式,您可以重用现有的 数据结构 ,它 保证了您在 add_toys
中明确实现的唯一性 。另外add/update函数方便修改collection.
改进:字符串构建
此外,您的字符串函数可以重构:
def __str__(self):
subject = "{} is a {}".format(self.name, self.kind)
hasToys = "has no toys" if not self.toys else "has the following toys: {}".format(self.toys)
return "{subject} that {hasToys}".format (subject, hasToys)
它使用三元运算符代替if语句;直接引用(通过 self
!)新的 set
字段:self.toys
加上一个 3 步建筑,以允许 单个 return 作为最后清晰可见的期望。
我有这个代码:
class Pet(object):
def __init__(self,name=""):
self.name = name
self.kind = "Unknown"
self.toys = []
def add_toys(self,toys):
new_list = []
for toy in self.toys:
if toy not in new_list:
new_list.append(toy)
return new_list
def __str__(self):
toys_list = add_toys(self,toys)
if self.toys == []:
return "{} is a {} that has no toys".format(self.name,self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name,self.kind,toys_list)
在函数 add_toys()
中,我有 return 值 new_list。
我想在函数 __ str__
中使用那个 return 值并将其定义为 toys_list
。
但是,当我写 toys_list = add_toys(self, toys)
时,它说:
add_toys
is an undefined variable
不能直接调用class方法,必须使用self调用。
像这样..
self.toys_list= self.add_toys(self, toys)
在 add_toys 中的第一件事是从 class 级别变量访问玩具变量,因此删除该参数,第二个是 add_toys(self,toys)
语法不正确,您需要像 self.add_toys()
class Pet(object):
def __init__(self,name=""):
self.name = name
self.kind = "Unknown"
self.toys = []
def add_toys(self):
new_list = []
for toy in self.toys:
if toy not in new_list:
new_list.append(toy)
return new_list
def __str__(self):
toys_list = self.add_toys()
if self.toys == []:
return "{} is a {} that has no toys".format(self.name, self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name, self.kind, toys_list)
选择:
class Pet(object):
def __init__(self,name=""):
self.name = name
self.kind = "Unknown"
self.toys = []
def add_toys(self, toys):
new_list = []
for toy in toys:
if toy not in new_list:
new_list.append(toy)
return new_list
def __str__(self):
toys_list = self.add_toys(self.toys)
if self.toys == []:
return "{} is a {} that has no toys".format(self.name, self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name, self.kind, toys_list)
你的 add_toys
方法不好,你没有使用 toys
参数,它不应该 return 任何东西,它应该像
class Pet:
# __init__ is OK
def add_toys(self, *toys):
for toy in toys:
if toy not in self.toys:
self.toys.append(toy)
def __str__(self):
if not self.toys:
return "{} is a {} that has no toys".format(self.name, self.kind)
else:
return "{} is a {} that has the following toys: {}".format(self.name, self.kind, self.toys)
像这样使用
p = Pet("Foo")
p.add_toys("ball")
p.add_toys("plate", "frisbee")
print(p) # Foo is a Unknown that has the following toys: ['ball', 'plate', 'frisbee']
你可以直接使用一个set
class Pet:
def __init__(self, name, kind="Unknown"):
self.name = name
self.kind = kind
self.toys = set()
def add_toys(self, *toys):
self.toys.update(toys)
问题是未定义的 函数。缺少引用 self(每个 class 成员、字段或方法都需要):
toys_list = self.add_toys()
.
重新考虑设计
为什么 toys 的 collection 管理了两次?
(a) 作为可以重复的字段 toys
,
(b) as return from add_toys
这将隐藏重复项并确保唯一元素。
您必须保持两者同步。它们的功能不同,应适用于不同的 use-cases.
假设:独特的玩具
我也会直接使用 set 作为字段 toys
的类型。因为通过这种方式,您可以重用现有的 数据结构 ,它 保证了您在 add_toys
中明确实现的唯一性 。另外add/update函数方便修改collection.
改进:字符串构建
此外,您的字符串函数可以重构:
def __str__(self):
subject = "{} is a {}".format(self.name, self.kind)
hasToys = "has no toys" if not self.toys else "has the following toys: {}".format(self.toys)
return "{subject} that {hasToys}".format (subject, hasToys)
它使用三元运算符代替if语句;直接引用(通过 self
!)新的 set
字段:self.toys
加上一个 3 步建筑,以允许 单个 return 作为最后清晰可见的期望。