0

いくつかの属性を持つクラスがあるとします。同じ方法でいくつかの選択を変更したい。ただし、属性をリストに入れることができないため、これはかなり面倒です。

例えば:

class BOB:
    def __init__(self,name,color,shape):
        self.lenname = len(name)
        self.lencolor = len(color)
        self.lenshape = len(shape)

def BOBmodify_lenname(instance):
    instance.lenname *= 2

def BOBmodify_lencolor(instance):
    instance.lencolor *= 2

def BOBmodify_lenshape(instance):
    instance.lenshape *= 2

私の目標は、[lenshape、lencolor] のような属性のリストの形式である種の入力を取得し、リストを反復処理してそれらを 2 倍する関数を作成することです。これは不可能なので、属性ごとに関数を使用する必要があります

ここでは、3 つの属性しかなく、それぞれを変更するために 3 つの関数が必要です。より多くの属性を持つクラスの場合、これはすぐに非現実的になります。これが可能であればいいですね:

def BOBmodify(instance,attribute_list):
    for attribute in attribute_list:
        instance.attribute *= 2

そして、する

BOBmodify(bobinstance, [lenname, lenshape])

私の知る限り、属性をリストに入れることはできないため、これは不可能です。では、関数に複数の異なる属性に対して同じことをさせたい場合、この状況をどのように処理すればよいでしょうか? スタックオーバーフローとグーグルでこれを検索しましたが、関連するものは何もありませんでした。助けてください。ありがとう!

4

1 に答える 1

3

You can define a method like this, and pass attributes as strings:

def modify_attrs(self, attrs):
    for attr in attrs:
        val = getattr(self, attr)
        setattr(self, attr, val*2)

...

bobinstance.modify_attrs(['lenname', 'lenshape']) 

Demo:

>>> bobinstance = BOB('spam', 'red', 'square')
>>> bobinstance.__dict__
{'lenshape': 6, 'lencolor': 3, 'lenname': 4}
>>> bobinstance.modify_attrs(['lencolor', 'lenname'])
>>> bobinstance.__dict__
{'lenshape': 6, 'lencolor': 6, 'lenname': 8}
于 2013-09-07T06:08:31.840 に答える