Python属性魔术

时间:2017-03-31 10:05:51

标签: python

在这个简单的代码片段中,inner()函数实际上何时被调用? 我已经阅读了有关python属性的内容,但我不确定它在这里做了什么魔术。

>>> class Magic:
...     @property
...     def __repr__(self):
...         def inner():
...             return "It works!"
...         return inner
...
>>> repr(Magic())
'It works!'

当我删除"@property"时,我收到预期的错误:

TypeError: __repr__ returned non-string (type function)

1 个答案:

答案 0 :(得分:4)

__repr__应该给出对象的人类可读表示......

  

返回包含对象的可打印表示的字符串。

     

对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时会产生具有相同值的对象,否则该表示形式是包含在尖括号中的字符串,其中包含名称对象的类型以及通常包括对象的名称和地址的附加信息。类可以通过定义__repr __()方法来控制此函数为其实例返回的内容。

您正在返回一个功能。 尝试:

>>> class Magic:
...     def __repr__(self):
...         def inner():
...             return "It works!"
...         return inner()
...
>>> repr(Magic())
'It works!'

同样值得一读的是@property装饰者和装饰者......请参阅this answer

要回答你“内部()函数何时被实际调用?”,请参见下文。当repr()代表您致电Magic.__repr__()时,它就会被调用。

#!/usr/bin/env python3

def my_decorator(info):
    def my_dec_inner(self):
        return "Testing"
    return my_dec_inner

class Magic:
    @my_decorator
    def __repr__(self):
        def inner():
            return "It works!"
        return inner

m = Magic()

# these are nearly synonymous
print(m.__repr__())
print(repr(m))

# this is actually a 'bound function' - my_decorator
print(m.__repr__)
Testing
Testing
<bound method Magic.my_dec_inner of Testing>