gpt4 book ai didi

python - 为什么 getattr 的行为与手动更新对象不同

转载 作者:行者123 更新时间:2023-11-28 22:52:33 28 4
gpt4 key购买 nike

有人可以解释为什么我在运行下面的 Python 脚本时得到不同的输出吗?

我不明白为什么 getattr(sys.modules['importme'], 'MyClass') 不打印 __repr__() 中定义的自定义函数 MyClass

打印测试.py

#!/usr/bin/env python
import sys

import importme

def main():
# This line prints "<class 'importme.MyClass'>"
m = getattr(sys.modules['importme'], sys.argv[1])
# This line prints "<MyClass {'text':, 'number':0}>"
#m = importme.MyClass()
print(m)

if __name__ == '__main__':
main()

importme.py

class MyClass(object):
text = ''
number = 0

def __init__(self, text = '', number = 0):
self.text = text
self.number = number

def __repr__(self):
return "<MyClass {'text':%s, 'number':%d}>" % (self.text, self.number)

最佳答案

在第一种情况下,您获取importme.MyClass类对象,您打印的字符串是它的repr,即类对象repr

在第二种情况下,您创建了一个 MyClass 类型的实例,在这种情况下,打印调用您的自定义 repr(__repr__ 适用于类的实例)。

顺便说一句,因为你第一次import importme,这个

getattr(sys.modules['importme'], sys.argv[1])

等同于:

getattr(importme, sys.argv[1])

我猜你在第一种情况下的意思是这样的:

m = getattr(importme, sys.argv[1])()

关于python - 为什么 getattr 的行为与手动更新对象不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20361885/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com