1

私の質問は 2 つあります。scaleまず、プロパティの 1 つに割り当てられた値に応じて異なる動作をする1 つのメソッドを持つクラスを定義したいと思います。以下は、XXX何かが欠けているコード部分に署名する私の現在の試みです。

class C(object):
    def __init__(self):
        self._scaling_method = None

    def same(self, u):
        return u

    def double(self, u):
        return u * 2

    scale = same

    @property
    def scaling_method(self):
        return self._scaling_method

    @scaling_method.setter
    def scaling_method(self, value):
        if value.lower() == "double":
            self._scaling_method = "double"
            print "Scaling method set to 'double'."
            # XXX method scale should be set to double
        elif value.lower() == "same":
            self._scaling_method = "same"
            print "Scaling method set to 'same'."
            # XXX method scale should be set to same
        else:
            print "Unknown scaling method."

cのインスタンスである場合、できるCようにしたい

c.same(3) # yields 3
c.double(3) # yields 6
c.scale(3) # yields 3 because scale defaults to same
c.scaling_method = "double"
c.scale(3) # yields 6

scaling_methodこれが正しく設定されたら、引数を使用してプロパティを設定し、scaleそれに応じてメソッドを定義できるようにしたいと思います__init__。今のところ、この 2 番目の部分で私が考える唯一の解決策は、クラスのコアと__init__セクションの両方で各スケーリング メソッドを定義することですが、これはかなりぎこちないようです。

編集:ここで適応される可能性のあるこの回答に気付きました。

4

2 に答える 2

0

これは、この回答から導き出した解決策です。ステートメントは、print適切なエラー処理に置き換えることができます。

class C(object):
    def __init__(self, scaling_method="same"):
        self._list_scaling_methods = ("same", "double")
        if scaling_method in self._list_scaling_methods:
            self._scaling_method = scaling_method
        else:
            print "Unknown scaling method."
            self._scaling_method = None

    @property
    def scaling_method(self):
        return self._scaling_method

    @scaling_method.setter
    def scaling_method(self, value):
        if value in self._list_scaling_methods:
            self._scaling_method = value
        else:
            print "Unknown scaling method."

    @property
    def scale(self):
        return getattr(self, self._scaling_method)

    def same(self, u):
        return u

    def double(self, u):
        return u * 2
于 2013-07-15T11:08:52.503 に答える