簡體   English   中英

如何設置變量的子屬性?

[英]How to set a variable's subproperty?

我是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

無論如何,所有變量名都被替換為這些有趣的東西,僅用於解釋一般概念。

所以這里的問題出在第三行。 我們如何settings.Type帶有其子屬性settings.Type.enum.Bird的變量settings.Type ,其中enum.Bird我想是某種不同種類的動物的枚舉,它是settings.Type的子屬性?

我嘗試做一些測試以在上述5行之后添加一行,以查看enum.Bird是否仍然存在:

settings.Type = settings.Type.enum.Bird

而且可以。 因此,對於此實例settings ,其子屬性Type不會被其enum.Bird的子屬性覆蓋,它仍然知道enum.Bird是其子屬性。

您能否建議我是否需要在Python中實現這一行,我該怎么做?

我想這對學習Python的人來說是一個非常有趣的知識,因此我在這里提出了這個問題以供討論。 我試圖以C ++的方式思考,但我沒有弄清楚。

我真的沒什么問題。 考慮在python中定義的Enum

import enum


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

Type.BirdType.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屬性settings.TypeType的實例(可能是Invalid的實例),並完成以下操作:

     def AddAnimalSettings(*args) settings = MyClass(*args) settings.Type = Type.Bird return settings 
  • property的使用替換為定制描述符,該描述符也將處理通過類的訪問。 在這種情況下,請閱讀有關property的文檔,該文檔還提供了等效的python代碼。 obj is None時,您需要更改的情況是__get__

     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工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM