现在我正在学习Python并且正在努力学习OOP的一些概念,其中之一是(对我来说)动态初始化类实例并将它们分配给动态生成的变量名称是多么困难以及我为什么要阅读它我不应该首先这样做。
在大多数具有相似方向的线程中,答案似乎是它不是Pythonic。
例如generating variable names on fly in python
有人可以详细说明吗?
采取典型的OOP学习案例:
LOE = ["graham", "eric", "terry_G", "terry_J", "john", "carol"]
class Employee():
def __init__(self, name, job="comedian"):
self.name = name
self.job = job
为什么这样做更好:
employees = []
for name in LOE:
emp = Employee(name)
employees.append(emp)
然后
for emp in employees:
if emp.name == "eric":
print(emp.job)
而不是
for name in LOE:
globals()[name] = Employee(name)
和
print(eric.job)
谢谢!
答案 0 :(得分:6)
如果动态生成变量名,则不知道存在哪些名称,也不能在代码中使用它们。
globals()[some_unknown_name] = Foo()
嗯,现在怎样?你无法安全地做到这一点:
eric.bar()
因为您不知道eric
是否存在。你最终还是要使用字典/列表来测试eric
的存在:
if 'eric' in globals(): ...
因此,只需将对象存储在字典或列表中即可:
people = {}
people['eric'] = Foo()
通过这种方式,您还可以安全地迭代一个数据结构来访问所有分组对象,而无需从其他全局变量中对它们进行排序。
答案 1 :(得分:1)
globals()
会为您提供dict
,您可以将其命名为。{1}}。但你可以同样制作自己的dict
并将名字放在那里。
因此,它归结为“命名空间”的概念,即将类似事物隔离到单独的数据结构中的概念。
你应该这样做:
employees = {}
employees['alice'] = ...
employees['bob'] = ...
employees['chuck'] = ...
现在,如果您的程序的另一部分描述了演习的各个部分,那么您可以这样做:
drill['chuck'] = ...
你不会和Chuck这个人发生名字冲突。如果一切都是全球性的,那么你就会遇到问题。查克甚至可能失去工作。