【问题标题】:Pass enum type as constructor argument将枚举类型作为构造函数参数传递
【发布时间】:2018-01-18 19:31:15
【问题描述】:

我是 python 新手,我想在函数中将枚举作为参数传递给构造函数。

编辑:我正在开发一个类的程序,该类必须组织不同类型的数据,但这些数据类型中的大多数都可以以相同的方式处理。这些数据不会同时或按可预见的顺序全部添加。因此,我想保留相同的功能,只是改变构造函数存储数据的方式。让我们考虑这个更简单的例子:

假设我有一个枚举

from enum import Enum, auto

class HouseThing(Enum):
    people = auto()
    pets = auto()
    furniture = auto()

我有一个类 House 可以包含部分或全部这些东西

class House():

    def __init__(self, address, people = None, pets = None, 
        furniture = None):
        self.address = address, 
        if self.people is not None:
            self.people = people

        etc....

现在我想要一个功能来建造新的装修房屋,但我想使用一个可以用于任何房屋的功能:

house_things = HouseThing.furniture

def make_house_with_some_house_things(neighborhood, house_things):
     neighborhood.append(House(house_things.name = house_things.name))

有没有办法在不首先测试 HouseThing house_things 是什么类型的情况下做到这一点? house_things.name 传递一个字符串,但我希望它能够将其用作关键字。

【问题讨论】:

    标签: python enums constructor


    【解决方案1】:

    我不确定你到底想在这里实现什么,但为了解决这个难题:

    首先,更改House以确定它已通过:

    class House():
    
        def __init__(self, address, *house_things):
            self.address = address
            for ht in house_things:
                if ht is HouseThings.people:
                    self.people = ht
                elif ht is HouseThings.pets:
                    self.pets = ht
                elif ht is HouseThings.furniture:
                    self.furniture = ht
                else:
                    raise ValueError('unknown house thing: %r' % (ht, ))
    

    然后,将make_house_with_some_house_things 更改为只传递给它的房子:

    def make_house_with_some_house_things(neighborhood, house_things):
         neighborhood.append(House(house_things))
    

    【讨论】:

    • 我已经编辑了我的问题以提供更多上下文,并且我还建议对您的答案进行编辑,因为在您的示例中,人不再是构造函数的参数。谢谢!
    • @DimitriCoukos:谢谢,我忘了删除那些行。需要注意的一件事:您没有错误保护——如果您的房子不允许养宠物,并且传入了 HouseThings.pets... 房子现在有宠物了。
    • 啊,是的,幸运的是,我的课程最终将拥有所有数据类型。
    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多