Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中枚举实例方法_Python_Python 3.x_Enums - Fatal编程技术网

在Python中枚举实例方法

在Python中枚举实例方法,python,python-3.x,enums,Python,Python 3.x,Enums,我想列举类中的一些实例方法。operate功能需要使用foo1,foo2,。。作为Foo.FOO1,Foo.FOO2 class Machine: def __init__(self): self.operate() def foo1(self): pass def foo2(self): pass .. class Foo(Enum): FOO1 = Machine.foo1 #Mach

我想列举类中的一些实例方法。
operate
功能需要使用
foo1
foo2
,。。作为
Foo.FOO1
Foo.FOO2

class Machine:
    def __init__(self):
        self.operate()

    def foo1(self):
        pass
    def foo2(self):
        pass
    ..

    class Foo(Enum):
        FOO1 = Machine.foo1 #Machine is not defined
        FOO2 = Machine.foo2 #Machine is not defined
        ..

    def operate(self):
        #use self.Foo.FOO1, self.Foo.FOO2,..

我不知道如何定义enum类。

如果Foo类中所有不以
开头的方法都是您想要使用的方法,只需迭代Foo类的内容并获得匹配的方法的属性:

class Machine:
    def operate(self):
        for attribute in dir(self.Foo):
            if attribute[0] != "_":
                getattr(self.Foo, attribute)()
下面是对我的案例最有意义的内容,在init方法中定义enum似乎是一条可行之路

class Machine:
    def __init__(self):
        class Foo(Enum):
            FOO1 = self.foo1
            FOO2 = self.foo2
            ..
        self.Foo = Foo 
        self.operate()

    def foo1(self):
        pass

    def foo2(self):
        pass
    ..

    def operate(self):
        #self.Foo.FOO1(), self.Foo.FOO2(),.. availabe
        #self.Foo holds the enumeration

@giannisl9提出的解决方案存在缺陷,尽管乍一看它显然是有效的,但仔细检查发现
Enum
被破坏了:

from enum import Enum


class Machine:

    def __init__(self):
        class Foo(Enum):
            FOO1 = self.foo1
        self.foo = Foo
        self.operate()

    def foo1(self):
        pass

    def operate(self):
        # breaks Enum contract, breaks syntax, breaks functionality...
        self.foo.FOO1()  # Enum member is NOT available! Method of class Machine bound in its place.
        print(type(self.foo))  # {type}<class'enum.EnumMeta'> - Enum 'Foo'
        print(type(self.foo.FOO1))  # {type} <class 'method'> - should be Enum member
        print(type(self.foo.FOO1.name))  # {AttributeError}'function'object has no attribute 'name'
        print(type(self.foo.FOO1.value))  # {AttributeError}'function'object has no attribute 'value'
然而,正如我所理解的那样,枚举应该是类的内部,因为从本体上讲,它涉及到编码/缩写一组适合于类的所有实例的状态。这很有道理

\uuuu init\uuuu
中声明它为
self
实例常量没有多大意义。相反,它应该被用作一个符号类常量,允许对可能与实例相关的所有公共内容进行编码

from enum import Enum


class Machine:

    class Foo(Enum):  
        # you could comma separate any combination for a given state
        FOO1 = "foo1"   
        FOO2 = "foo2"

    def __init__(self, arg_foo):

        self.foo = arg_foo
        self.operate()
        self.all_operations()

    def foo1(self):
        print('drinks at bar1')

    def foo2(self):
        print('drinks at bar2')

    def all_operations(self):
        for one_member in Machine.Foo:
            self.__getattribute__(one_member.value)()

    def operate(self):
        self.__getattribute__(str(self.foo.value))()


go_bar1 = Machine(Machine.Foo.FOO1)
go_bar2 = Machine(Machine.Foo.FOO2)
go_bar1.all_operations()  # bar crawl
或者这大概就是你想要的:

from enum import Enum


class Machine:

    def __init__(self, receive: Enum):

        for one in receive.value:
            if one is not None:
                one(self)  # Zen of Python

    def foo1(self):
        print('drinks at bar1')

    def foo2(self):
        print('drinks at bar2')


class Runner(Enum):
    FOO1 = getattr(Machine, 'foo1'), getattr(Machine, 'foo2')
    FOO2 = getattr(Machine, 'foo2'), None


first = Machine(Runner.FOO1)
second = Machine(Runner.FOO2)

我希望这能有所帮助。

您的意思是需要找到“一些实例方法”的方法吗?如何区分要枚举的方法和不想枚举的方法?此方法可能有助于说明所遇到的错误:@giannisl9未绑定的方法和函数之间没有区别。与未绑定方法不同,绑定方法可以在不知道其实例的情况下使用。Python3只知道函数类型和方法类型。就实例而言,前者是未绑定的,后者是绑定的。感谢您的回答,但我认为这并没有回答我关于如何定义枚举类的问题。问题是:这打破了
enum
。困难在于将它定义为一个内部类,因为您必须内省外部类,以引用外部方法。大多数食谱建议选择更简单的解决方案,因为结果是一样的(更好)。这能做到吗?很可能,但很难证明时间是正确的,下一个来的人将很难理解您的代码。如果需要,docs/api将提示一个简单的解决方案。相反,我们建议避免这种情况。PEP 395提供了一个有趣的陷阱和错综复杂的概述。。。
from enum import Enum


class Machine:

    def __init__(self, receive: Enum):

        for one in receive.value:
            if one is not None:
                one(self)  # Zen of Python

    def foo1(self):
        print('drinks at bar1')

    def foo2(self):
        print('drinks at bar2')


class Runner(Enum):
    FOO1 = getattr(Machine, 'foo1'), getattr(Machine, 'foo2')
    FOO2 = getattr(Machine, 'foo2'), None


first = Machine(Runner.FOO1)
second = Machine(Runner.FOO2)