现在我正在学习Python并且正在努力学习OOP的一些概念,其中之一是(对我来说)动态初始化类实例并将它们分配给动态生成的变量名称是多么困难以及为什么我在阅读我不应该'首先要做到这一点.
在大多数具有类似方向的线程中,答案似乎是它不是Pythonic.
有人可以详细说明吗?
以典型的OOP学习案例为例:
LOE = ["graham", "eric", "terry_G", "terry_J", "john", "carol"]
class Employee():
def __init__(self, name, job="comedian"):
self.name = name
self.job = job
Run Code Online (Sandbox Code Playgroud)
为什么这样做更好:
employees = []
for name in LOE:
emp = Employee(name)
employees.append(emp)
Run Code Online (Sandbox Code Playgroud)
然后
for emp in employees:
if emp.name == "eric":
print(emp.job)
Run Code Online (Sandbox Code Playgroud)
而不是这个
for name in LOE:
globals()[name] = Employee(name)
Run Code Online (Sandbox Code Playgroud)
和
print(eric.job)
Run Code Online (Sandbox Code Playgroud)
谢谢!
如果动态生成变量名,则不知道存在哪些名称,也不能在代码中使用它们.
globals()[some_unknown_name] = Foo()
Run Code Online (Sandbox Code Playgroud)
好吧,现在呢?你无法安全地做到这一点:
eric.bar()
Run Code Online (Sandbox Code Playgroud)
因为你不知道是否eric存在.eric无论如何,你最终还是要使用词典/列表来测试它的存在:
if 'eric' in globals(): ...
Run Code Online (Sandbox Code Playgroud)
因此,只需将对象存储在字典或列表中即可:
people = {}
people['eric'] = Foo()
Run Code Online (Sandbox Code Playgroud)
这样,您还可以安全地迭代一个数据结构来访问所有分组对象,而无需从其他全局变量中对它们进行排序.