我想定義一個可以迭代的單個對象,而不必創建一個類,然後創建一個實例。像這樣的東西:在類上定義神奇方法
class Thing(object):
stuff = ["foo", "bar", "baz"]
@classmethod
def __iter__(cls):
return iter(cls.stuff)
for thing in Thing:
print thing
但是,這並不實際工作。有沒有辦法做到這一點?
我想定義一個可以迭代的單個對象,而不必創建一個類,然後創建一個實例。像這樣的東西:在類上定義神奇方法
class Thing(object):
stuff = ["foo", "bar", "baz"]
@classmethod
def __iter__(cls):
return iter(cls.stuff)
for thing in Thing:
print thing
但是,這並不實際工作。有沒有辦法做到這一點?
什麼阿什維尼在他的評論正確建議如下。這個工程在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)
我的不好,錯過了'東西'的位置。 :/ –
@AshwiniChaudhary在Python 2中,我認爲它有效。 – nickie
它會工作,因爲(即使沒有classmethod),Python可以通過在MRO中查找來找到該屬性。早些時候我誤解了它,並認爲你已經在'Thing'中定義了'stuff'而不是'ThingType'。所以... ;-) –
Thing
實際上是否需要一個類型?你可以把它認爲有型似可調用的行爲,這很可能是簡單的對象:
class RealThing(object):
pass
class ThingFactory(object):
def __iter__(self):
return iter(["foo", "bar", "baz"])
def __call__(self):
return RealThing()
Thing = ThingFactory()
對於一個類中定義'在元類__iter__'。 –
在課堂上發生魔法方法查找。所以你要麼必須創建一個實例和類或類和元類。但它也似乎可以只是子類列表(至少在你的例子)。 – jedwards
@jedwards好吧,我試圖避免在模塊的命名空間中創建額外的東西,但我想我只需要處理它。這是一個非常簡單的例子,在我的實際使用情況中,有更多的內部狀態而不僅僅是一個列表。 – DanielGibbs