在参考文件中: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)
答案 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
上为您的课程提供基础是一个非常好的主意 - 然后您可以将其用作你在暗示。