如何设置变量的子属性?

时间:2016-07-31 16:58:35

标签: python

我是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 ++的方式思考,但我没有弄清楚。

1 个答案:

答案 0 :(得分:2)

我真的不明白这个问题是什么。考虑在python中定义的Enum

import enum


class Type(enum.Enum):
    Bird = 0
    Cat = 1

Type.Bird类的Type.CatType实例

>>> 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有效。