在顶部导入 json 模块时如何在 class' 方法中调用 json.load

How to call json.load inside a class' method while importing the json module at the top

如果我一开始就从 json 导入加载方法,我不明白为什么 json.load 在调用加载方法时检索我一个 "TypeError: load() takes 1 positional argument but 2 were given"。而是将其导入到方法中并调用 game_data = load(file) 函数。为什么?我怎样才能像所有其他方法一样在顶部完成导入负载?

class start:
    from module_x import method_y
    from json import load

    def __init__(self,game,data = {}):
        self.name = game + '.json'
        self.data = data

def xyz():
        self.method_y() #calling other methods with self.method is okay

def loading(self , file = None): 
        if not file:
            file = self.name
        with open(file, 'r') as file:
            game_data = self.load(file) #here is not okay
        return game_data

相反是可以的:

 def loading(self , file = None): 
        from json import load
        if not file:
            file = self.name
        with open(file, 'r') as file:
            game_data = load(file) 
        return game_data

如果您应用适当的缩进,问题是您的实例会传递给调用的方法。当你写 self.method() 时,Python 会调用 method(self).

您可以导入模块 json 而不是方法,那么您将拥有 self.module.method().

class start:
    import json

    def __init__(self,game,data = {}):
        self.name = game + '.json'
        self.data = data

    def loading(self , file = None): 
            if not file:
                file = self.name
            with open(file, 'r') as file:
                game_data = self.json.load(file)
            return game_data

作为旁注:您应该避免将导入放在文件开头以外的任何地方。来自 PEP8,Python 风格指南:

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

问题是,模块 "json" 的函数 "load" 只接受一个参数,但由于它现在是您创建的 class 的一种方法,它总是会得到 "self" 作为第一个参数,传递的参数作为第二个参数。 所以直接导入函数到class是不可能的。您需要导入模块本身或导入加载函数中的函数或最后一个选项将其导入文件顶部,然后您才能按预期调用和使用它。

选项 1:

class myClass:
    import json
    def myLoadindFunction(self, fileObject):
        fileContent = self.json.load(fileObject)

选项 2:

class myClass:
    def myLoadindFunction(self, fileObject):
        from json import load
        fileContent = load(fileObject)

选项 3:

from json import load
class myClass:
    def myLoadindFunction(self, fileObject):
        fileContent = load(fileObject)