4

最初からクラスインスタンスがいくつあるかわからないので、動的に作成する必要がありますが、コードを整理して読みやすくしたいと思います。

私はこのようなことをすることを考えていました:

names = ['Jon','Bob','Mary']

class Person():
    def __init__(self, name):
        self.name = name

people = {}
for name in names:
    people[name] = Person(name)

それは機能しますが、これをオンラインで行っている人々の例を見つけることができないようです(私はあまり見ていませんでしたが)。これを避けるべき理由はありますか?もしそうなら、なぜそして何がより良い選択肢ですか?

4

3 に答える 3

5

クラスインスタンスを動的に作成したい場合、これはまさにコードで行っていることですが、ソリューションは完全に見栄えがよく、Pythonの方法であると思います(もちろん他の方法もあると言わざるを得ませんが)。考えてみると、次のようなクラスに新しいインスタンスを登録/保存できます。

class Person():
    people={}
    @classmethod
    def create(cls,name):
        person=Person(name)
        cls.people[name]=person
        return person
    def __init__(self, name):
        self.name = name

そして、あなたが冒険的になっているなら、あなたはメタクラスで同じことを試すことができます、しかし私はあなたの研究のためにそれを残します:-)

于 2012-10-01T13:49:51.497 に答える
3

使用するtype(name, bases, dict)

ドキュメントから:

新しいタイプのオブジェクトを返します。これは本質的に、クラスステートメントの動的な形式です。名前文字列はクラス名であり、 name属性になります。basesタプルは、baseクラスを項目化し、bases属性になります。dictディクショナリは、クラス本体の定義を含む名前空間であり、 dict属性になります。たとえば、次の2つのステートメントは、同じタイプのオブジェクトを作成します。

>>> class X(object):
...     a = 1
...
>>> X = type('X', (object,), dict(a=1))

あなたの例のために:

>>> JonClass = type('JonClass', (object,), {'name': 'Jon'})
>>> jon_instance = JonClass()
>>> jon_instance.name
'Jon'
>>> type(jon_instance)
<class '__main__.JonClass'>
于 2012-10-01T13:31:32.440 に答える
1

ジェネレータ式を使用して辞書を作成するのはどうですか?

people = dict((name, Person(name)) for name in names)

しかし、これに加えて、あなたの解決策は完全に有効です。

于 2012-10-01T14:05:09.447 に答える