python内置函数类型,如何为新类型定义成员函数?

时间:2013-08-29 07:04:09

标签: python

在参考文件中: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)

3 个答案:

答案 0 :(得分: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)

您想在枚举词典中添加classmethod。这就是@classmethod装饰者的作用。

运行它会:

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

如果您希望能够迭代MY_COLORS本身,则需要在此问题中添加元类:Python: Is it possible to make a class iterable using the standard syntax?

答案 1 :(得分: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

答案 2 :(得分:0)

要使您的课程成为可迭代课程,您需要为其提供next()方法 - 在object上为您的课程提供基础是一个非常好的主意 - 然后您可以将其用作你在暗示。