我正在读一本书编程 Python(第 4 版(,我遇到了一段代码的问题,包括getattr
.这是一个用于查找图标文件的循环,但我无法确定它在哪里搜索(以什么顺序(。我有使用getattr
的基本知识,比如它在__dict__
中搜索名称,但无法弄清楚这个。
mymod = __import__(__name__) # import self for dir
path = __name__.split('.') # poss a package path
for mod in path[1:]: # follow path to end
mymod = getattr(mymod, mod) # only have leftmost
mydir = os.path.dirname(mymod.__file__)
myicon = os.path.join(mydir, self.iconmine)
评论来自书中。最后一条评论说"只有最左边的",所以如果我们愿意,为什么要运行循环 最左边的 - 我们不能做path[-1]
吗?
假设您正在处理文件夹/home/py_project/
中的 python 项目
如果要使用以下路径对模块(.py文件(进行编码:/home/py_project/modules/my_file.py
模块在/home/py_project/modules/__init__.py
中定义
然后
mymod = __import__(__name__) # import self for dir
print(mymod)
产量:<module 'modules' from '/home/py_project/modules/__init__.py'>
path = __name__.split('.')
print(path)
产量:['modules', 'my_file']
for mod in path[1:]
正在对上一个列表进行切片,并获取从 1 到 inf 的所有项目,在这种情况下,只考虑"my_file"。
for mod in path[1:]: # follow path to end
mymod = getattr(mymod, mod) # only have leftmost
# same as mymod = modules.my_file
mydir = os.path.dirname(mymod.__file__)
print(mydir)
产量:/home/py_project/modules
myicon = os.path.join(mydir, self.iconmine)
print(myicon)
产量:/home/py_project/modules/path_to_self.iconmine # I don't know what self.iconmine is, you didn't mention it.
始终打印(或调试(理解代码的步骤。
getattr((
getattr()
方法返回对象的命名属性的值。如果未找到,则返回提供给函数的默认值。例如:
getattr(( 方法的语法是:
getattr(object, name[, default])
上述语法等效于:
object.name
例:
class Person:
name = "Louis"
person = Person()
print('Name:', person.name)
print('Name:', getattr(person, "name")) # using getattr() is the same as person.name
for
循环的目的是从包传递getattr
到最终模块。你不能简单地getattr('foo.bar.baz.quux')
,你必须做
mymod = __import__('foo')
mymod = getattr(mymod, 'bar')
mymod = getattr(mymod, 'baz')
mymod = getattr(mymod, 'quux')
当然,这正是循环在展开时所做的。