在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)