我是Python的新手。我从软件供应商处获得了一些Python示例代码,他们使用boost.python扩展了他们的软件API,因此我们可以用Python调用它们。我对某些细分市场感到困惑,例如:
settings = zoo.AddAnimalSettings(carni_bird_list)
settings.Name = 'birds'
settings.Type = settings.Type.enum.Bird
settings.water_min = 1, units.Litre
settings.food_min = 10, units.Gram
无论如何,所有的变量名都被替换为这些有趣的东西,只是为了解释一般的想法。
所以问题在于第3行。我们如何设置变量settings.Type
及其子属性settings.Type.enum.Bird
,其中enum.Bird
我认为是某种不同种类的动物的枚举,这是{{1}的子属性}}?
我尝试做一些测试,在上面的5行后添加一行,看看settings.Type
是否还在那里:
enum.Bird
它运作正常。
因此,对于此实例settings.Type = settings.Type.enum.Bird
,它的子属性settings
不会被其Type
的子属性覆盖,它仍然知道enum.Bird
是其子属性。
你能告诉我是否需要在Python中实现这一行,我该怎么做?
我认为对于学习Python的人来说这将是一个非常有趣的知识,所以我在这里提出这个问题进行讨论。我试图以C ++的方式思考,但我没有弄清楚。
答案 0 :(得分:2)
我真的不明白这个问题是什么。考虑在python中定义的Enum
:
import enum
class Type(enum.Enum):
Bird = 0
Cat = 1
Type.Bird
类的Type.Cat
和Type
是实例:
>>> Type.Bird
<Type.Bird: 0>
>>> Type.Cat
<Type.Cat: 1>
因此他们可以访问自己的类,Type
:
>>> Type.Bird.__class__
<enum 'Type'>
现在您只需向property
类添加Type
即可获得该行为:
class Type(enum.Enum):
Bird = 0
Cat = 1
@property
def enum(self):
return self.__class__
现在你有:
>>> Type.Bird
<Type.Bird: 0>
>>> Type.Bird.enum
<enum 'Type'>
>>> Type.Bird.enum.Bird
<Type.Bird: 0>
>>> Type.Bird.enum.Cat
<Type.Cat: 1>
请注意,虽然上述内容允许您编写Bird.enum
但不允许您像Type.enum
那样进行访问,因为这会返回property
个对象。
要获得您在该代码中看到的确切行为,您可以:
将settings.Type
属性设置为Type
的实例(可能是Invalid
个)并完成:
def AddAnimalSettings(*args)
settings = MyClass(*args)
settings.Type = Type.Bird
return settings
将property
的使用替换为自定义描述符,该描述符也将通过类处理访问。在这种情况下,读取the documentation about property
,它也提供其等效的python代码。在__get__
:
obj is None
class MyProperty(object):
# omissis
def __get__(self, obj, objtype=None):
if obj is None:
return objtype # <-- changed this line
if self.fget is None:
raise AttributeError("unreadable attribute")
return self.fget(obj)
将此用作:
class Type(enum.Enum):
Bird = 0
Cat = 1
@MyProperty
def enum(self):
return self.__class__
现在你有了:
>>> Type.enum
<enum 'Type'>
以便Type.enum.Bird
有效。