为什么getattr与手动新建对象的行为不同

时间:2013-12-03 21:18:56

标签: python python-module getattr repr

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

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

printtest.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)

1 个答案:

答案 0 :(得分:4)

在第一种情况下,您获取importme.MyClass类对象,并且您打印的字符串是repr,即<{1}} < em> class object 。

在第二种情况下,您创建了repr类型的实例,在这种情况下,打印会调用您的自定义MyClassrepr适用于实例该课程。)

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

import importme

相当于:

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

我猜你在第一种情况下的意图是:

getattr(importme, sys.argv[1])