我正在讀取一些數據,我想創建類 - 這是在加載時完成的。這些類被分組到一個Special
類中,該類只能使用運行時信息進行實例化。這些類依賴於這個類,因此它們只能在創建後纔有用。下面是一些簡單的代碼,表明我是多麼希望它的工作,使用random
而不是實際運行時信息:我應該在這裏使用元類嗎?
import random
def make_foo(param1, param2):
class Foo:
def __init__(self, special):
self.param1 = param1
self.param2 = param2
self.special = special
def do(self):
print "%s is doing" % self
def __str__(self):
return "Foo<%s,%s with %s>" % (self.param1, self.param2,
self.special)
return Foo
def make_bar(foo):
class Bar:
def __init__(self, special):
self.foo = foo(special)
def do(self):
print "%s is doing" % (self,)
def __str__(self):
return "Bar<%s>" % self.foo
return Bar
def make_grouper(foobars):
class Grouper:
def __init__(self, special):
self.foobars = [foobar(special) for foobar in foobars]
return Grouper
def make_special(howtomake, groups):
class Special:
def __init__(self):
self.important = random.choice(howtomake)
self.groups = [group(self) for group in groups]
def __str__(self):
return "Special<%s>" % self.important
return Special
Foo10_20 = make_foo(10, 20)
Foo30_40 = make_foo(30, 40)
Bar = make_bar(Foo10_20)
Grouper1 = make_grouper([Foo10_20, Foo30_40])
Grouper2 = make_grouper([Bar, Bar])
Special = make_special("IMPORTANTINFO", [Grouper1, Grouper2])
s = Special()
s.groups[0].foobars[0].do()
s.groups[0].foobars[1].do()
s.groups[1].foobars[0].do()
s = Special()
s.groups[0].foobars[0].do()
s.groups[0].foobars[1].do()
s.groups[1].foobars[0].do()
輸出示例:
Foo<10,20 with Special<O>> is doing
Foo<30,40 with Special<O>> is doing
Bar<Foo<10,20 with Special<O>>> is doing
Foo<10,20 with Special<I>> is doing
Foo<30,40 with Special<I>> is doing
Bar<Foo<10,20 with Special<I>>> is doing
它可以概括爲不必創建一組類需要綁定到一個參數special
(所以所有的構造函數,一旦完成了類,只需要一個special
參數)。這可以使用元類更優雅地完成,還是這種代碼是正確的?
我看過,但刷了它,但感謝提出。我覺得我需要一些東西......如果有什麼事情,我正在做的事情的概念是關閉的。但工廠的想法運作良好,我使用它 – Claudiu 2011-04-20 15:44:17