gpt4 book ai didi

python - 如何将对象转换回用于创建它的代码?

转载 作者:行者123 更新时间:2023-12-05 04:40:27 25 4
gpt4 key购买 nike

例如,如果我有一个这样的自定义 Python 对象;

#!/usr/bin/env python3
import os
base_dir = os.path.abspath(".")
class MyFile(dict):
def __init__(self, name, size = None, dir = base_dir):
self.name = name
self.path = os.path.join(dir, name)
self.bytes = size

在我程序的某处,我初始化了我的对象类;

a = MyFile(name = "foo", size = 10)

我希望能够首先返回用于创建对象的代码。例如;

print(a)
# <__main__.MyFile object at 0x102b84470>
# should instead print:
# MyFile(name = "foo", size = 10)

但是因为我的对象有一些默认属性值,所以我只希望在对象初始化时显式包含它们的情况下,它们才会显示在输出中;

b = MyFile(name = "bar", dir = "/home")
print(b)
# <__main__.MyFile object at 0x102b845c0>
# should instead print:
# MyFile(name = "bar", dir = "/home")

需要明确的是,我并不是要从源代码中提取它,因为我的很多对象都是动态创建的,我希望也能为它们返回相同的东西;

l = [ ("baz", 4), ("buzz", 12) ]
f = [ MyFile(name = n, size = s) for n, s in l ]
print(f)
# [<__main__.MyFile object at 0x1023844a8>, <__main__.MyFile object at 0x102384828>]
# should instead print:
# [ MyFile(name = "baz", size = 4), MyFile(name = "buzz", size = 12) ]

我看到了 inspect 库 ( https://docs.python.org/3/library/inspect.html ),但它似乎没有任何功能可以做到这一点。我错过了什么?此功能非常类似于 R 的 dput 函数。

最佳答案

在非常基本的层面上,您可以这样做:

class MyClass:
def __init__(self, a, b):
self.a = a
self.b = b

def __repr__(self):
return f'{self.__class__.__name__}({self.a}, {self.b})'


class MyOtherClass(MyClass):
def method(self):
pass


c = MyClass(1, 2)
oc = MyOtherClass(3, 4)
print(c, oc)

结果:

MyClass(1, 2) MyOtherClass(3, 4)

这会按照您的要求进行,并考虑子类化以提供正确的类名。但当然,由于多种原因,事情可能会变得复杂:

class MyClass:
def __init__(self, a, b):
self.a = a + 1
self.b = b if b < 10 else a
self.c = 0

def inc_c(self):
self.c += 1

def __repr__(self):
return f'{self.__class__.__name__}({self.a - 1}, {self.b})'

构造函数未涵盖 c 的值,因此建议的调用会将其设置为 0。虽然您可以补偿 a+ 1,但是 b 的值将更加复杂 - 如果您意识到有人可以更复杂之后更改了值。

然后您需要考虑子类可以覆盖行为等。因此,做这样的事情只在非常有限的用例中有意义。

关于python - 如何将对象转换回用于创建它的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70268395/

25 4 0