Test
Python 3.3 を使用して、クラスを別のクラスにバインドしTestManager
て、マネージャーがインスタンスを作成しTest
て保存し、後でそれらにアクセスできるようにしたいと考えています。
一言で言えば(つまり、Pythonシェル...)、これを実行できるようにしたいです(name
がの属性であると仮定しますTest
):
> t = Test.objects.get(id=3)
> t.name
# Returns 'Name 3'
秘訣は、オブジェクトのコレクションが「静的な」コレクションであるということです。つまり、最初に (ユーザーによってではなく) 作成され、その後、変更も削除も、レコードの削除も編集も行われません。修正されました。だからここに私が試したコードがあります:
class TestManager:
def __init__(self, *args, **kwargs):
self._tests = [Test(name='Name {}'.format(i)) for i in range(100)]
def get(self, id):
return self._tests[id]
class Test:
objects = TestManager()
def __init__(self, name=''):
self.name = name
そして、予想通り、NameError: global name 'Test' is not defined
循環初期化が原因です。理想的には、create()
(の代わりに)リストに要素を追加することを処理するメソッドがマネージャーにある必要があります__init__()
が、それは作成がマネージャーではなく他の場所で行われることを意味します。
これまでのところ、私が思いついた「最良の」解決策はget()
、リストが空であるかどうかをメソッドで最初に確認し、メソッドを呼び出すfill_the_damn_list()
ことですが、私には非常にハックに思えます。これを行う別の方法は、リストの代わりに dict を使用し、最初にその場でインスタンスを作成することget()
です。後者の利点は、役に立たない/決してget()
-ed インスタンスを作成しないことですが、合計で 100 個しかないため、それが本当に重要かどうかはわかりません。また、このソリューションのハック性は、自分...
私は Python にまったく慣れていないので (十分に明確でない場合は...)、それを実行してシンプルに保つためのより良い方法があるかどうか疑問に思います。必要に応じてリファクタリングしても構いませんが、まだより良い解決策が見つかりません...