gpt4 book ai didi

python - 调用从方法返回的对象方法作为方法变量

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:33 24 4
gpt4 key购买 nike

我有一个事物列表,我将使用文件作为示例。每种类型的文件都需要以不同的方式进行处理。我创建了一个类“MyFile”,而不是维护一个巨大的 if:elif:else: 结构,而是创建了一个以文件类型作为键的字典。这被存储为类变量。

class MyFile(object):

def process_xlsx(self):
#process file stuff for Excel
pass

def process_docx(self):
#process file stuff for Word
pass

def get_filetype(self):
try:
return self.FileTypes[file_extension]
except KeyError:
return None #filetype not handled... yet

FileTypes = {
"XLSX": ("Excel File", process_xlsx),
"DOCX": ("Word Document", process_docx)
}

在不同的类/对象/模块中,我实例化 MyFile 类并开始单步执行文件。 MyFile 对象已正确创建。

f = MyFile("full_file_path_and_name")
file_type = f.get_filetype()

file_type 有一个包含键和函数对象的元组。这是一个例子: xls_0386.xlsx -('Excel 文件',) doc_0386.docx - ('Word 文件', )

问题:如何调用从 f.get_filetype() 返回的函数?

file_type[1]()

返回:process_xlsx() 缺少 1 个必需的位置参数:'self'

file_type[1]

不会产生错误,但从未真正进行调用(在 process_???? 方法中从未到达断点)

那么,以这种方式调用对象方法的语法是什么?

我知道用我的具体情况来解释有点复杂,对此我深表歉意。

提前致谢。

最佳答案

当您创建时,您在其中定义的方法只是函数。只有当您从类的实例中检索它们的名称时,它们才会绑定(bind)到该实例,从而生成绑定(bind)方法。这是通过 descriptor protocol 完成的.

因此,当您创建 FileTypes 字典时:

FileTypes = {
"XLSX": ("Excel File", process_xlsx),
"DOCX": ("Word Document", process_docx)
}

这些都是简单的函数。

基本上,您有三个选择:

  1. 不要在类定义时创建字典。在创建实例时创建它,以便您可以在其中存储绑定(bind)方法:

    class MyFile(object):
    def __init__(self):
    self.FileTypes = {
    "XLSX": ("Excel File", self.process_xlsx),
    "DOCX": ("Word Document", self.process_docx)
    }

    因为这会查找 self 上的方法,所以它们是绑定(bind)的。

  2. 当您在 get_filetype() 中查找方法时,“手动”绑定(bind)该方法:

    def get_filetype(self):
    try:
    return self.FileTypes[file_extension].__get__(self) # binding!
    except KeyError:
    return None #filetype not handled... yet
  3. 返回functools.partial() object使用 self 作为位置参数,而不仅仅是函数:

    from functools import partial

    def get_filetype(self):
    try:
    return partial(self.FileTypes[file_extension], self) # also a kind of binding
    except KeyError:
    return None #filetype not handled... yet

所有三种方法都会将一个对象返回给调用者,调用时会将 MyFile() 的正确实例传递给所选函数。

关于python - 调用从方法返回的对象方法作为方法变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38620351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com