2015-04-20 21 views
4

我想定義一個可以迭代的單個對象,而不必創建一個類,然後創建一個實例。像這樣的東西:在類上定義神奇方法

class Thing(object): 
    stuff = ["foo", "bar", "baz"] 

    @classmethod 
    def __iter__(cls): 
     return iter(cls.stuff) 

for thing in Thing: 
    print thing 

但是,這並不實際工作。有沒有辦法做到這一點?

+4

對於一個類中定義'在元類__iter__'。 –

+0

在課堂上發生魔法方法查找。所以你要麼必須創建一個實例和類或類和元類。但它也似乎可以只是子類列表(至少在你的例子)。 – jedwards

+0

@jedwards好吧,我試圖避免在模塊的命名空間中創建額外的東西,但我想我只需要處理它。這是一個非常簡單的例子,在我的實際使用情況中,有更多的內部狀態而不僅僅是一個列表。 – DanielGibbs

回答

3

什麼阿什維尼在他的評論正確建議如下。這個工程在Python 2

class ThingType(type): 
    __stuff__ = ["foo", "bar", "baz"] 

    @classmethod 
    def __iter__(cls): 
     return iter(cls.__stuff__) 

class Thing(object): 
    __metaclass__ = ThingType 

for thing in Thing: 
    print thing 

而且這部作品在Python 3:

class ThingType(type): 
    __stuff__ = ["foo", "bar", "baz"] 

    @classmethod 
    def __iter__(cls): 
     return iter(cls.__stuff__) 

class Thing(object, metaclass=ThingType): 
    pass 

for thing in Thing: 
    print(thing) 
+0

我的不好,錯過了'東西'的位置。 :/ –

+0

@AshwiniChaudhary在Python 2中,我認爲它有效。 – nickie

+0

它會工作,因爲(即使沒有classmethod),Python可以通過在MRO中查找來找到該屬性。早些時候我誤解了它,並認爲你已經在'Thing'中定義了'stuff'而不是'ThingType'。所以... ;-) –

0

Thing實際上是否需要一個類型?你可以把它認爲有型似可調用的行爲,這很可能是簡單的對象:

class RealThing(object): 
    pass 

class ThingFactory(object): 
    def __iter__(self): 
    return iter(["foo", "bar", "baz"]) 

    def __call__(self): 
    return RealThing() 

Thing = ThingFactory()