-1

複数のプロパティを個別に参照せずにPythonで設定するにはどうすればよいですか? 以下は私の解決策です。

class Some_Class(object):

    def __init__(self):
        def init_property1(value): self.prop1 = value
        def init_property2(value): self.prop2 = value

        self.func_list = [init_property1, init_property2]

    @property
    def prop1(self):
        return 'hey im the first property'

    @prop1.setter
    def prop1(self, value):
        print value

    @property
    def prop2(self):
        return 'hey im the second property'

    @prop2.setter
    def prop2(self, value):
        print value


class Some_Other_Class(object):

    def __init__(self):

        myvalues = ['1 was set by a nested func','2 was set by a nested func']
        some_class= Some_Class()

        # now I simply set the properties without dealing with them individually
        # this assumes I know how they are ordered (in the list)
        # if necessary, I could use a map

        for idx, func in enumerate(some_class.func_list):
            func(myvalues[idx])

        some_class.prop1 = 'actually i want to change the first property later on'

if __name__ == '__main__':
    test = Some_Other_Class()

これは、ユーザー定義の値で初期化するプロパティが多数ある場合に必要になりました。そうしないと、私のコードは、各プロパティを個別に設定する巨大なリストのように見えます (非常に面倒です)。

多くの人が以下に良い答えを持っていることに注意してください。私は良い解決策に達したと思います. これは主に質問を明確に述べようとする再編集です。しかし、誰かがより良いアプローチを持っている場合は、共有してください!

4

3 に答える 3

2

@property デコレータを使用するだけです

>>> class A:
...    a=2
...    @property
...    def my_val(self,val=None):
...        if val == None:return self.a
...        self.a = val
...
>>> a=A()
>>> a.my_val
2
>>> a.my_val=7
>>> a.my_val
7

このようなもの?

設定のみを許可したい場合は、デフォルト値を与えないでください

>>> class A:
...    a=2
...    @property
...    def my_val(self,val):
...        self.a = val
...
>>> a=A()
>>> a.my_val
<Exception>
>>> a.my_val=7
>>> a.a
7

または、取得のみを許可する場合は、2 番目の引数を省略します。

>>> class A:
...    a=2
...    @property
...    def my_val(self):
...        return self.a
...      
...
>>> a=A()
>>> a.my_val
2
>>> a.my_val=7
<Exception>
于 2012-07-25T23:37:32.047 に答える
2

私は...ようやく、あなたがやろうとしていることを知っていると思います。あなたがそれに近づいている方法でそれを行う必要はありません。これを突き刺してみましょう。

class someclass(object):

    def __init__(self):
        func_list = [self.setter1, self.setter2]
        value_list = [1, 2]
        #    These lines don't need to be this complicated.
        #    for ind in range(len(func_list)): 
        #        func_list[ind](value_list[ind])

        for idx, func in enumerate(func_list):
            func(value_list[idx])

        #  Or even better
        for idx, (func, val) in enumerate(zip(func_list, value_list)):
            func(val)

    def setter1(self, value): 
        self.a = value

    def setter2(self, value): 
        self.b = value

2 番目の形式では idx 変数と enumerate の呼び出しが不要であることは指摘しておく価値がありますが、他の場所でそれが必要かどうかはわかりませんでした。

于 2012-07-26T00:11:52.370 に答える
0

オブジェクト dict でプロパティを検索すると、プロパティ記述子 (存在する場合) が取得され、同様にクラスも取得されます。例えば

a = SomeClass()
descriptor = a.__dict__.get('descriptor', type(a).__dict__.get('descriptor'))

それが記述子であると仮定するとdescriptor、次のメソッドがあります。

['deleter', 'fdel', 'fget', 'fset', 'getter', 'setter']

と に注意してfgetくださいfset

于 2012-07-25T23:35:46.847 に答える