为什么这个装饰器无法从带有“from module import *”的模块导入?

时间:2012-08-25 04:55:50

标签: python properties import decorator

我在模块中有以下装饰器:

class CachedProperty(object):
    """Decorator that lazy-loads the value of a property.

    The first time the property is accessed, the original property function is
    executed. The value it returns is set as the new value of that instance's
    property, replacing the original method.
    """

    def __init__(self, wrapped):
        self.wrapped = wrapped
        try:
            self.__doc__ = wrapped.__doc__
        except:
            pass

    def __get__(self, instance, instance_type=None):
        if instance is None:
            return self

        value = self.wrapped(instance)
        setattr(instance, self.wrapped.__name__, value)

        return value

我想从这个模块导入这个装饰器和其他东西:

from clang.cindex import *

但是我无法以这种方式导入那个单独的装饰器,如果我这样做的话就可以了:

from clang.cindex import CachedProperty

然后我可以使用@CachedProperty

为什么我无法通过*导入此类,而我可以导入其他类?

1 个答案:

答案 0 :(得分:4)

查看模块顶部附近是否定义了名为__all__的变量。如果是这样,它将具有分配给它的字符串名称的序列(列表或元组)。这些是由from ... import *语句导入的模块的公共名称。

如果没有定义__all__名称,模块中定义的所有名称(以及从其他模块导入的名称)都不会以下划线开头。

确保__all__序列包含字符串“CachedProperty”。