2

在参考文档中:http ://docs.python.org/2/library/functions.html#type 展示了如何定义成员变量 X = type('X', (object,), dict(a=1 ))

但是如何定义一个成员函数,所以类可以等价于:

class X(object):
    a = 1
    def get_a(self):
        return self.a

这个问题是通过向给定的自定义枚举类型添加可迭代特性而产生的。在我的项目中,这里有一个旧的自定义枚举类型:

def enum(*sequential, **named):
    """ Contruct an enum """
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.items())
    enums['reverse_mapping'] = reverse
    return type('Enum', (), enums)

它可以像这样使用:

MY_COLORS = enum(RED=0,BLUE=1)

但是此方法定义的枚举不能用作“for in”语句中的可迭代对象。我希望添加一个成员函数来返回枚举的键、值和项。然后我可以做这样的事情:

[item for item in MY_COLORS.keys()]

python3的答案:

def enum(*sequential, **named):
    """ Contruct an enum """
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.items())
    key_names = list(enums.keys())
    enums['reverse_mapping'] = reverse        
    @classmethod
    def keys(klass):
        return key_names 
    enums['keys'] = keys
    return type('Enum', (), enums)
4

3 回答 3

1

@Eugeny Loy 想法的一个类似但更短的方法是使用 lambda:

>>> X = type('X', (object,), dict(a=1, get_a=lambda self: self.a))
>>> x = X()
>>> x.a
1
>>> x.get_a()
1
于 2013-08-29T07:21:01.047 回答
1

试试这个:(在Python 2.7中测试)

def enum(*sequential, **named):
    """ Contruct an enum """
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.items())
    key_names = enums.keys()
    enums['reverse_mapping'] = reverse        
    @classmethod
    def keys(klass):
       return key_names 
    enums['keys'] = keys
    return type('Enum', (), enums)

您想将 a 添加classmethod到 enums 字典中。这就是@classmethod装饰器所做的。

运行它会:

>>> MY_COLORS = enum(RED=0, BLUE=1)
>>> MY_COLORS.keys()
['BLUE', 'RED']

如果您希望能够对其MY_COLORS自身进行迭代,则需要添加一个元类,如以下问题所示:Python:是否可以使用标准语法使类可迭代?

于 2013-08-29T07:11:40.637 回答
0

为了让你的类成为一个可迭代的类,你需要给它一个next()方法 - 给你的类提供基础也是一个很好的主意object- 然后你可以按照你的建议使用它。

于 2013-08-29T07:15:07.977 回答