使用元类的__getattribute__方法修改返回的属性

时间:2015-09-30 15:17:01

标签: python metaprogramming decorator

我试图实现*一个类/类型,以用作dict的键的枚举器。我想修改返回的属性值,例如,对于自定义类:

class TestKeys(Keys):
    one = 1
    two = 2

而不是让TestKeys.one返回1,我想覆盖它以返回类似的内容( string "TestKeys.one"。我尝试过以下操作,但它会进入无限递归......

class _Keys_Meta(type):
    # Store all attribute values to list ``__values__``
    #     (if they dont start with '__')                                                                                                                     
    def __init__(self, name, bases, dict):
        self.__init__(self)
        self.__values__ = [ self.__dict__.values()[ii] for ii,ent 
                            in enumerate(self.__dict__)
                            if not ent.startswith('__') ]

    def __getattribute__(self, attr):                                                                                                                                                                       
        if( not hasattr(self, '__values__') ): 
            self.__values__ = []                                                                                                                                         
        if( attr in self.__values__ ): 
            return "{:s}.{:s}".format(self.__name__, str(attr))                                                                                                                                                
        return object.__getattribute__(self, attr)

class Keys(object):
    __metaclass__ = _Keys_Meta

如何修改访问属性时返回的值?

*我熟悉enum34,但我不喜欢它的一些功能。

0 个答案:

没有答案