微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

试图在另一个函数中使用一个函数的返回值,但得到未定义的变量 重新考虑设计假设:独特的玩具改进:字符串构建

如何解决试图在另一个函数中使用一个函数的返回值,但得到未定义的变量 重新考虑设计假设:独特的玩具改进:字符串构建

我有这个代码

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() 中,我有返回值 new_list。 我想在函数 __ str__ 中使用该返回值并将其定义为 toys_list。 但是,当我写 toys_list = add_toys(self,toys) 时,它说:

add_toys一个未定义变量

解决方法

你的 add_toys 方法不好,你没有使用 toys 参数,它不应该返回任何东西,它应该像

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)
,

add_toys 中的第一件事是从类级别变量访问玩具变量,因此删除该参数,第二个是 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,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,toys_list)
,

问题是未定义的函数。缺少引用 self(每个类成员、字段或方法都需要): toys_list = self.add_toys()

重新考虑设计

为什么要对 玩具 收藏进行两次管理? (a) 作为字段 toys 可以有重复, (b) 作为 add_toys 的返回,这将隐藏重复项并确保唯一的元素。

您必须保持两者同步。它们的功能不同,应应用于不同的用例。

假设:独特的玩具

我也会直接使用 set 作为字段 toys 的类型。因为通过这种方式,您可以重用现有的数据结构保证您在 add_toys 中明确实现的唯一性。另外添加/更新功能方便修改集合。

改进:字符串构建

此外,您的字符串函数可以重构:

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 步构建,以允许 单次返回作为最后清晰可见的期望。

,

不能直接调用类方法,必须使用self调用。

像这样..

self.toys_list= self.add_toys(self,toys)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。