1

我想定义一个类,它的__repr__方法定义为它只写出所有不是方法的属性的名称和值。我怎样才能做到这一点?我已经设法像这样编写它,但我意识到这不会检查属性类型。

class Example:
    def __repr__(self):
        return "\n".join(["%s: %s" % (x, getattr(self, x)) for x in dir(self) if not x.startswith('__')])

这里缺少的是对属性类型的检查。

4

3 回答 3

4

你可以使用inspect这样的东西:

from inspect import ismethod,getmembers

class Example:
    def __repr__(self):
        return "\n".join("%s: %s" % (k, v) for (k,v) in getmembers(self,lambda x: not ismethod(x)))

    def method(self):
        return 1

a = Example()
a.foo = 'bar'
print a

这也获取了双下划线属性 ( __module__, __doc__)。如果你不想要这些,你可以很容易地过滤掉它们。

于 2013-04-29T17:35:27.380 回答
2

尝试内置函数可调用: http ://docs.python.org/2/library/functions.html#callable

于 2013-04-29T17:32:03.600 回答
1

假设您的类没有定义__slots__您也可以只迭代实例的__dict__(或通过vars()函数)。

class Superclass:
    def __init__(self, w):
        self.w = w

class Example(Superclass):
    def __init__(self, x, y, z):
        super().__init__(1234)
        self.x = x
        self.y = y
        self.z = z

    @property
    def x_prop(self):
        return self.x

    @classmethod
    def do_something(cls, z):
        return str(cls) + str(z)

    def __call__(self):
        return 4444

    class_property = 42


    def __repr__(self):
        return "\n".join("%s: [%s]" % (k, v) for (k,v) in vars(self).items())

example = Example(2, lambda y: z, '4')
example2 = Example(example, 6j, b'90')

print(repr(example2))

这打印

x: [x: [2]
y: [<function <lambda> at 0x7f9368b21ef0>]
z: [4]
w: [1234]]
y: [6j]
z: [b'90']
w: [1234]
于 2013-04-29T17:45:02.470 回答