gpt4 book ai didi

python - 动态创建的类方法在运行时可以知道它们的 'created' 名称吗?

转载 作者:行者123 更新时间:2023-12-02 02:41:43 26 4
gpt4 key购买 nike

我有一个类,我想用它从文本文件(已解析)中提取数据,并且我想使用动态创建的类方法来执行此操作,因为否则会有大量重复代码。每个创建的类方法应与文本文件的特定行相关联,例如'.get_name()' --> 读取文本文件第 0 行的一部分。我的想法是使用字典来存储“要创建的”方法名称和相应的行。

import sys
import inspect

test_file = [['Name=Jon Hancock'],
['Date=16.08.2020'],
['Author=Donald Duck']]

# intented method names
fn_names = {'get_name': 0, 'get_date': 1, 'get_author': 2}

class Filer():
def __init__(self, file):
self.file = file

def __get_line(cls):
name = sys._getframe().f_code.co_name
line = fn_names[name] # <-- causes error because __get_line is not in fn_names
print(sys._getframe().f_code.co_name) # <-- '__get_line'
print(inspect.currentframe().f_code.co_name) # <-- '__get_line'
return print(cls.file[line][0].split('=')[1])

for key, val in fn_names.items():
setattr(Filer, key, __get_line)

f = Filer(test_file)
f.get_author()
f.get_date()

当我尝试访问方法名称以将该方法链接到文本文件中的指定行时,我确实收到错误,因为方法名称始终是“__get_line”而不是例如“__get_line”。 'get_author'(我所希望的)。我认为解决这个问题的另一种方法是让 '__get_line' 接受一个附加参数(行),并通过在 'setattr()' 期间传递 val 来设置它,如下所示:

def __get_line(cls, line):
return print(cls.file[line][0].split('=')[1])

 for key, val in fn_names.items():
setattr(Filer, key, __get_line(val))

然而,Python 提示缺少 1 个参数(行)。

有什么想法可以解决这个问题吗?

最佳答案

基于一些假设,我会提出一个更简单的解决方案。您的文件似乎由键值对组成。您选择将行号映射到处理 = 符号之后的行的右侧的函数。 Python 通常不使用 getter。属性更好更容易使用。您可以通过使用 property 对象来获得类似于 getter 的功能,但这里确实不需要它。

class Filer():
def __init__(self, file):
self.file = file
for line in file:
name, value = line[0].split('=', 1)
setattr(self, name.lower(), value)

这就是您所需要的。现在您可以使用结果:

>>> f = Filer(test_file)
>>> f.author
'Donald Duck'

如果您希望拥有与您为每个属性建议的方法完全相同的可调用方法,我会完善您的建议,甚至一开始就没有方法。您实际上可以在 __getattr__ 中即时生成方法:

class Filer():
def __init__(self, file):
self.file = file

def __getattr__(self, name):
if name in fn_names:
index = fn_names[name]
def func(self):
print(self.file[index][0].split('=', 1)[1])
func.__name__ = func.__qualname__ = name
return func.__get__(self, type(self))
return super().__getattr__(name)

调用 __get__ 是一个额外的步骤,使函数的行为就像它是类的方法一样。它将函数对象绑定(bind)到实例,即使该函数不是类的一部分。

例如:

>>> f = Filer(test_file)
>>> f.get_author
<bound method get_author of <__main__.Filer object at 0x0000023E7A247748>>
>>> f.get_author()
'Donald Duck'

关于python - 动态创建的类方法在运行时可以知道它们的 'created' 名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63477308/

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