将一些类变量保存和恢复的纯文本Python语法文件?
将一些类变量保存和恢复的纯文本Python语法文件?
在我的情况下,我想在文件中保存和恢复一些“常规”变量(即int、字符串),这些变量最终将成为类属性。这个例子是我最接近的,通过使用import
:
a.py
b = 134 a = "hello"
mytest.py
import inspect class Teost: from a import * def __init__(self): self.c = 12 print(inspect.getmembers(self)) # has a and b print(self.__dict__) # no a and b print(self.a) # prints "hello" xx = Teost()
因此,在这里a.py
充当存储变量值(a
和b
)的文件,而类内部的from a import *
将它们作为类属性(self.a
和self.b
)获取,这几乎是我想要的。
不幸的是,在类中使用星号的import
语法是不被赞成的:
$ python mytest.py mytest.py:3: SyntaxWarning: import * only allowed at module level class Teost: [('__doc__', None), ('__init__', >), ('__module__', '__main__'), ('a', 'hello'), ('b', 134), ('c', 12)] {'c': 12} hello
... 因此,我得到了一个不好看的“SyntaxWarning:import * only allowed at module level”,我无法摆脱它(除非我禁用警告,但我不想这样做)
因此,我还有其他选择,可以使用写成a.py
的文件(即采用纯文本、Python语法),并将其中的变量最终成为一些类属性吗?
(我看到了一个链接How do I save and restore multiple variables in python?,但我不感兴趣pickle
或shelve
,因为它们都不会在Python语法的纯文本文件中写入)
admin 更改状态以发布 2023年5月22日
我的意思是,你可以做一些超级 hacky 的事情:
import inspect import a class A: def __init__(self): self.c = 12 print(('a', 'hello') in inspect.getmembers(self)) # has a and b print(('b', 134) in inspect.getmembers(self)) print('a' in self.__dict__) # no a and b print('b' in self.__dict__) print(self.a) # prints "hello" for name in dir(a): if not name.startswith('__'): # very brittle here val = vars(a)[name] setattr(A, name, val) x = A()
你可能想要将上述逻辑封装到一个元类中。
也许只是使用 exec
更简洁。如果你信任 a.py
的来源,那应该不会有太大问题。
你可以像这样将模块导入到你的类中:
代码:
class Teost: import a as _a_py_attrs def __init__(self): for name in dir(Teost._a_py_attrs): if not name.startswith('__'): setattr(self, name, getattr(Teost._a_py_attrs, name))
测试代码:
xx = Teost() print(xx.__dict__) print(xx.a)
结果:
{'a': 'hello', 'b': 134} hello
作为类属性:
如果将它们作为类属性而不是实例属性更可取,可以这样做:
class Teost: """ My Test Class """ import a as _a_py_attrs for name in dir(_a_py_attrs): if not name.startswith('__'): setattr(Teost, name, getattr(_a_py_attrs, name))
测试代码:
xx = Teost() print(xx.__dict__) print(xx.a)
结果:
{} hello