0

編集:元の問題には PyQt と matplotlib が関係しており、実際の質問は複雑すぎて説明できないため、単純化しようとしましたが、実際にはうまくいきませんでした。しかし、返信から、実際の問題は当初考えていたものとは別の場所にある可能性があることがわかりました。これがプログラミングを学ぶということだと思います。

みんな、ありがとう!


私は気になる文体の問題に直面しています。他の人にも役立つように、できるだけ一般的なものにしようとしました。次のクラスを検討してください。

class Values(object):
    def __init__(self):
        self.first_attr = None
        self.second_attr = None
        self.third_attr = None
        self.fourth_attr = None

    def set_first(self, data):
        self.first_attr = data

    def set_second(self, data):
        self.second_attr = data

    def set_third(self, data):
        self.third_attr = data

    def set_fourth(self, data):
        self.fourth_attr = data

    def add_to_three(self):
        attrs = (
                 self.first_attr,
                 self.second_attr,
                 self.third_attr,
                 )
        self._add_one(attrs)

    def add_to_two(self):
        attrs = (
                 self.second_attr,
                 self.fourth_attr,
                 )

        self._add_one(attrs)

    def _add_one(self, attrs):
        for attr in attrs:
            if attr:
                attr += 1

私たちには価値観があります。クラスは、異なる値の合計 4 つの属性を持つことができます。各値はセッターで設定できます (物事を単純化するためにデコレーターを使用しませんでした)。

値を増やす必要がある属性のタプルを持つ 2 つのメソッドもあります。これらの値は実行前に決定されます。

また、属性が設定されている場合に受け取る属性に 1 を追加するメソッド「add_one」もあります。そうでなければ、何も起こらないはずです。

次に、いくつかのインスタンスを作成して、いくつかの値を設定しましょう

first_values = Values()
first_values.set_second = 5

first_values.add_to_three()

second_values = Values()
second_values.set_first = 2
second_values.set_third = 4

second_values.add_to_two()

「add_one」メソッドは各属性が設定されているかどうかをチェックするため、これはうまく機能します。

しかし、属性が 50 個ある場合はどうなるでしょうか。それらをすべてNoneに設定するという考えは好きではありません。また、これらの add_to_ メソッドでタプルを明示的に記述するという考えも好きではありません。

Values クラスのみを変更して属性が多数ある場合、これを処理する最も適切な方法は何でしょうか?

4

2 に答える 2

0

このコードにより、タプルである属性を含む無制限の属性セットを持つオブジェクトを作成し、その内容をインクリメントできるようになります。

class Values():
    def __init__(self, *attrs):
        '''each element in attrs is a tuple(attrname, value)'''
        if attrs is not None:
            for a in attrs:
                n, v = a
                setattr(self, n, v)

    def add_one(self, attr):
        a = getattr(self, attr, None)
        if a:
            if isinstance(a, tuple):
                setattr(self, attr, tuple(e + 1 for e in a))
            else:
                setattr(self, attr, a + 1)

v = Values(('x', 1), ('y', 2), ('z', 3), ('t', (7, 8, 9)))
print('Initial values:', v.x, v.y, v.z, v.t)
v.add_one('x')
print('X modified:', v.x, v.y, v.z, v.t)
v.add_one('t')
print('T modified:', v.x, v.y, v.z, v.t)
v.add_one('a')
print('Tried to modify non-existent attribute "a"', v.x, v.y, v.z, v.t)

結果:

>>> import attr
Initial values: 1 2 3 (7, 8, 9)
X modified: 2 2 3 (7, 8, 9)
T modified: 2 2 3 (8, 9, 10)
Tried to modify non-existent attribute "a" 2 2 3 (8, 9, 10)
>>> 

このコードにより、潜在的に膨大な数の可能な属性のサブセットを含む各インスタンスでオブジェクトを動的に作成し、各インスタンスの属性を操作できます。

于 2013-07-30T18:03:55.590 に答える