我创建了这样的对象:

class Gender(Enum):
    FEMALE = 'female'
    MALE = 'male'
    RANDOM = random.choice([FEMALE, MALE])

我想每次都得到真正的随机值,但它不起作用:
>>> class Gender(Enum):
...    MALE = 'male'
...    FEMALE = 'female'
...    RANDOM = choice([MALE, FEMALE])
...
>>> Gender.RANDOM
<Gender.MALE: 'male'>
>>> Gender.RANDOM
<Gender.MALE: 'male'>
>>> Gender.RANDOM
<Gender.MALE: 'male'>
>>> Gender.RANDOM
<Gender.MALE: 'male'>

我也尝试过使用lambda,但是它看起来不太好,尽管它可以工作:
Gender.RANDOM()

是否有其他方法可以在不使用lambda表达式的情况下每次获取随机值?
我们使用这个枚举对象作为某个方法的参数的默认值,这就是为什么它应该是一个属性而不是一个函数,因为当我们使用Enum它不是一个函数时,它是一个属性而Gender.FEMALE也应该是一个属性:
def full_name(gender=Gender.FEMALE):
    ...


def full_name(gender=Gender.RANDOM):
    ...

最佳答案

我尝试了一种方法。而且它是有效的!

import random
import enum
class RANDOM_ATTR(enum.EnumMeta):
    @property
    def RANDOM(self):
        return random.choice([Gender.MALE, Gender.FEMALE])


class Gender(enum.Enum,metaclass=RANDOM_ATTR): #this syntax works for python3 only
    FEMALE = 'female'
    MALE = 'male'


print(Gender.RANDOM)   #prints male or female randomly

在这里,通过使RANDOM_ATTR的元类类似于classGender的对象,因此Gender具有metaclassesRANDOM_ATTR
但是,您在问题中描述的下面的代码并不像您期望的那样工作。
def full_name(gender=Gender.RANDOM):
    ...

Gender属性将只调用一次。要知道原因,请阅读此property。默认参数类似于函数的属性,只初始化一次。
为此,我建议你做如下的事情:
def full_name(gender=None):
    gender = gender or Gender.RANDOM
    ...

07-24 09:53
查看更多