一段代码中的问题 python getattr()

trouble in a piece of code python getattr()

我正在阅读一本书 Programming 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)

评论来自书中。最后一条评论说 "only have leftmost" 那么为什么 运行 如果我们想要循环 最左边 - 我们不能做 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()方法returns对象的命名属性的值。如果没有找到,它将 returns 提供给函数的默认值。例如:

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')

当您展开它时,这当然正是循环所做的。