を使用してプロパティを作成しますか?私はこのような何かを持っているラムダゲッターとセッター
name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value))
をコンパイラは私のsetter関数を好きではない:
私はこれを試してみました。
を使用してプロパティを作成しますか?私はこのような何かを持っているラムダゲッターとセッター
name = property(lambda self: self.__name, lambda self, value: self.__name = self.process_value(value))
をコンパイラは私のsetter関数を好きではない:
私はこれを試してみました。
あなたの問題は、ラムダの本体が式でなければならず、代入が文(Pythonの強力で深い区別です)でなければならないということです。あなたがlambda
Sを犯すことを主張した場合、あなたは多くのそのような例を満たすと回避策を紹介します(常にそこに1が通常だ、ではないが)、そのようなこの場合は、のように:
name = property(lambda self: self.__name,
lambda self, value: setattr(self,
'_X__name',
self.process_value(value)))
すなわち(ビルトインsetattr
を使用(これは関数なので、lambda
の身体で受け入れ可能ではなく)代入(これはステートメントであり、従ってlambda
の身体では容認できません)。
編集は:(あなたはクラスXにいるよう_X__name
に__name
を変更)あなたは手動でもデュアル下線属性の名前マングリングを実行する必要がある属性名は引用符で囲まれた文字列として提示され、それとしてPyhonコンパイラは文字列リテラルではなく、適切な識別子について問題のmanglingを行うだけなので、setattrになければなりません。
あなたがlist
を拡張している場合は、このように、__setitem__
を使用することができます。
class Position(list):
def __init__(self,x=0, y=0, z=0):
super(Position, self).__init__((x,y,z))
x = property(lambda self: self[0],
lambda self,value: self.__setitem__(0, value))
y = property(lambda self: self[1],
lambda self,value: self.__setitem__(1, value))
z = property(lambda self: self[2],
lambda self,value: self.__setitem__(2, value))
「なめらか」とは何ですか? –
恐らく「何か」。 – hughdbrown
プロパティ定義をもっと不明瞭にしようとしているようです。簡単な関数をlambdaに置き換える点は何ですか? –