gpt4 book ai didi

Python 2.x - 在同一个类中创建类的静态实例

转载 作者:太空狗 更新时间:2023-10-29 21:58:48 26 4
gpt4 key购买 nike

我正在尝试用 python 编写一个“枚举类”。我目前遇到的一个小麻烦是无法在枚举类中定义枚举值。也就是说,我可以这样做:

class Fruit:
def __init__(self, name):
self.name = name

class Fruits(Enum):
Apple = Fruit("apple")

但我想这样做,或者类似的易读的等价物:

class Fruit(Enum):
def __init__(self, name):
self.name = name

Apple = Fruit("apple")

不幸的是,我收到以下错误: 名称“水果”未定义

在这种情况下,可见性规则是什么?有什么鲜为人知的 Python 技巧可以帮助我吗?我更喜欢可以在 Enum 的元类中编写的东西,因为这会让用户使用起来不那么麻烦。

最佳答案

你可以制作一个元类来做这样简单的事情:

class MetaEnum(type):
def __new__(cls, class_name, parents, attrs):
def __init__(self, name=None):
if name is not None: self.name = name
attrs['__init__'] = __init__
Klass = type.__new__(cls, class_name, parents, attrs)
if 'instances' in attrs:
for name in attrs['instances']:
setattr(Klass, name.capitalize(), Klass(name))
del Klass.instances # clean up
return Klass

class Fruit(object):
__metaclass__ = MetaEnum
instances = ('apple', 'banana', 'cranberry')

for attr_name in dir(Fruit):
if not attr_name.startswith('_'):
attr = getattr(Fruit, attr_name)
if type(attr) is Fruit:
print('Fruit.{}, is a Fruit named {}'.format(attr_name, getattr(attr, 'name')))
else:
print('Fruit.{}, is a {}'.format(attr, type(attr)))

输出:

Fruit.Apple, is a Fruit named apple
Fruit.Banana, is a Fruit named banana
Fruit.Cranberry, is a Fruit named cranberry

关于Python 2.x - 在同一个类中创建类的静态实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16298329/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com