代码之家  ›  专栏  ›  技术社区  ›  Penny

以下代码中未定义错误名称'student2dict'的原因

  •  -1
  • Penny  · 技术社区  · 7 年前

    我刚开始学蟒蛇。下面是一些我试图测试的代码。 我的问题是: 现在,这些代码有一个错误: 名称 student2dict 未定义,当运行到 std_data 行。 有人能帮我弄清楚怎么修吗?谢谢。

    import json
    
    class Student(object):
    
        def __init__(self,name,age,score):
            self.name = name
            self.age = age
            self.score = score
    
        def student2dict(std):
            return{
                'name':std.name,
                'age':std.age,
                'score':std.score
                }
    
    s= Student('Penny',20,88)
    std_data = json.dumps(s,default=student2dict)
    print('Dump Student:',std_data)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   abarnert    7 年前

    您现有代码的问题是没有全局函数(或其他任何东西) student2dict ,因为你把它缩进了 class Student 定义。

    只要去掉它,它就会起作用:

    class Student(object):
    
        def __init__(self,name,age,score):
            self.name = name
            self.age = age
            self.score = score
    
    def student2dict(std):
        return{
            'name':std.name,
            'age':std.age,
            'score':std.score
            }
    
    s= Student('Penny',20,88)
    std_data = json.dumps(s,default=student2dict)
    print('Dump Student:',std_data)
    

    不过,似乎你希望它是一种方法,而不是一个简单的函数:

    在我尝试使用default=s.student2dict而不是dedault=student2dict之前

    一般方法需要 self 参数。这就是它如何知道你在调用哪个实例。你得到的错误大概是关于打电话 学生信息技术 有两个论点 s s.student2dict ,同样 s公司 又经过了 json.dumps )当它只想要一个( std )中。

    你可以解决这个问题:

    class Student(object):
    
        def __init__(self,name,age,score):
            self.name = name
            self.age = age
            self.score = score
    
        def student2dict(self, std):
            return{
                'name':std.name,
                'age':std.age,
                'score':std.score
                }
    

    现在你可以通过了 default=s.student2dict 它会起作用的。

    但这真的不是一个很好的设计。如果你没有真正使用 自己 不管怎样,你并不是真的在写一个实例方法。


    (你 能够 使之成为 static method 因为他们既不需要也不需要 自己 ,但我觉得在这里这样做毫无意义。如果这是你想要的,一个全局函数可能更有意义。)


    但是如果你摆脱了 性病 ,并使用 自己 相反呢?

    class Student(object):
    
        def __init__(self,name,age,score):
            self.name = name
            self.age = age
            self.score = score
    
        def student2dict(self):
            return{
                'name':self.name,
                'age':self.age,
                'score':self.score
                }
    

    现在,你不想通过 学生信息技术 ,因为那是 界限法 ,由实例拥有 s公司 . 不能用参数调用它,因为参数已绑定在中。对于两个参数而不是一个参数,您将得到相同的错误。

    你想要的是 非绑定方法 ,通过在 ,而不是实例,以便以后可以用任何实例调用它。这样地:

    s= Student('Penny',20,88)
    std_data = json.dumps(s,default=Student.student2dict)
    print('Dump Student:',std_data)
    

    这很有效,因为 Student.student2dict(s) 做同样的事情 s.student2dict() . 所以,如果你通过了 Student.student2dict json.dumps文件 ,当它启动时 S公司 ,你得到了你想要的。