0

私の質問は、「その場で」変数を作成する方法です。ランダムな属性セットを持つオブジェクトを生成しようとしています。

from random import randint, choice

class Person(object):
    def __init__(self):
      self.attributes = []    

possible_attributes= ['small', 'black', 'scary', 'smelly', 'happy'] # idk, random
chance = randint(1,5)

chosen_attributes = []
for i in xrange(chance):
    #psuedo code...
    local_var = choice(possible_attributes)
    if local_var not in chosen_attributes:
        VAR = local_var # VAR needs to be dynamic and 'global' for use later on
        chosen_attributes.append(local_var)
        Person.attributes.append(local_var)

私がこれをやりたいと思っているのは良い方法ではないので、誰かが私が探しているものを理解し、より良い方法(初心者にとってはうまくいく方法)を提供できるなら、私は最も感謝しています.

4

6 に答える 6

2

クラスのインスタンスに属性を追加するには、次を使用できます.__dict__

class Person(object):
    def addattr(self,x,val):
        self.__dict__[x]=val

出力:

>>> a=Person()
>>> a.addattr('foo',10)
>>> a.addattr('bar',20)
>>> a.foo
10
>>> a.bar
20
>>> b=Person()
>>> b.addattr('spam','somevalue')
>>> b.spam
'somevalue'
于 2012-08-15T04:18:34.967 に答える
2

ここで何を達成しようとしているのかはよくわかりませんが、ここにはいくつかのことがあるかもしれません....

class Person(object):
    def __init__(self):
        self.attributes = [] 

attributesこれは、またはコンストラクターからわかるよう__init__に、他の言語で呼び出されるオブジェクトを作成できるクラスオブジェクトを定義します。

しかし、あなたは持っています

Person.attributes.append(local_var)

ここPersonにクラスオブジェクトがありますが、このクラスから作成されたオブジェクトのみが定義されているため、定義する属性は実際にはありません...

新しい人を作成し、適切な属性を追加できます。

>>> me = Person()
>>> me.attributes.append('humble')

2 つ目は、重複する属性を含め、何でもリストに追加できるため、属性に直接アクセスするべきではありません。

属性を追加する関数を単純に追加してみませんか。

class Person(object):
    def __init__(self):
        self._attributes = [] # note any variable starting with _ is meant to be private 
    def add_attribute(attribute):
        if attribute not in self._attributes:
            self._attributes.append(attribute)

パフォーマンスが懸念される場合は、set()代わりにa を使用できます。[]これは、エントリの重複が許可されず、ルックアップのチェックが非常に高速であるためです。欠点は、値がハッシュ可能である必要があることです。つまり、文字列、int、またはその他の単純なデータ型です...

于 2012-08-15T04:40:31.603 に答える
1

を使用しvarsます。例えば:

>>> import math
>>> class foo: pass
>>> vars(foo)
{'__module__': '__main__', '__doc__': None}
>>> vars(foo)['fn']=math.sin
>>> foo.fn(2)
0.9092974268256817
>>> vars(foo)
{'__module__': '__main__', '__doc__': None, 'fn': <built-in function sin>}

ご存知のように、メソッドはもう 1 つの引数を持つ単なる関数です。

于 2012-08-15T04:22:22.193 に答える
1

これが何のために必要なのかはわかりませんが、実際にはグローバル変数は必要なく、ランダム/動的な属性セットを持つ単一の Person オブジェクトだけが必要であると推測します。そのためには、次のことが必要setattrですrandom.sample()

crazy_person = Person()
selected_attribute_names = random.sample(possible_attributes, 3)
for attribute_name in selected_attribute_names:
    setattr(crazy_person, attribute_name, True)

# optional -- if you want to have a list of attributes, just copy that in:
crazy_person.attributes = selected_attribute_names
# vars(crazy_person).keys() will give you more or less the same thing though, for free

# hasattr(crazy_person, 'small') will tell you if you picked 'small'
# if we chose 'small', then from here on, crazy_person.small will be True as well
于 2012-08-15T04:24:49.223 に答える
0

これは、定義が与えられた場合に、属性のランダムなセットでオブジェクトを構築する方法です。

import random

possible_attributes= ['small', 'black', 'scary', 'smelly', 'happy']

class Person(object):
    def __init__(self):
      self.attributes = random.sample(possible_attributes, random.randint(0, len(possible_attributes)))

これにより、可能な属性のリストからランダムな数の属性が選択されます。

>>> print Person().attributes
['small', 'smelly']
>>> print Person().attributes
['scary', 'smelly', 'happy']
于 2012-08-15T04:20:49.193 に答える
0

一般に、グローバル名前空間を汚染する代わりに、グローバルに追加したくありません。辞書はすべてにアクセスする名前空間のような方法を提供しますが、本当に必要な場合は、 globals()[x] =something を使用して項目を変更するか、おそらく非常に厄介な

exec "var_name=somehting"
于 2012-08-15T04:21:29.340 に答える