2017-09-16 6 views
-1

前にこれが重複フラグが設定されていますが、これは前にquestion has been answeredということがわかりましたが、ここで提供されている解決策は私のケースには当てはまりません。クラスプロパティをプログラムで設定しようとしています。私はそのためのpropertyを使用することができます知っているので、私はこのことについて考えた:私は対話的にこれを実行するとプロパティオブジェクトを返すクラスプロパティ

class Foo: 
    def __init__(self, x): 
     self._x = x 
     def getx(): return self._x 
     def setx(y): self._x = y 
     self.x = property(fget=getx, fset=setx) 

しかし、私が手:

>>> f = Foo(42) 
>>> f.x 
<property object at 0x0000000> 
>>> f._x 
42 
>>> f.x = 1 
>>> f.x 
1 

これを解決する方法はありますか?

編集:

私は、私はあまりを残している可能性を感じるので、ここで私が実際に到達しようとしていますものです。私はconfigと呼ばれるクラス変数を持つクラスを持っています。これには、プロパティとして設定する設定値が含まれています。

class _Base: 
    config =() 

    def __init__(self, obj, **kwargs): 
     self._obj = obj() 
     for kwarg in kwargs: 
      # Whatever magic happens here to make these properties 

# Sample implementation 
class Bar(_Base): 
    config = (
     "x", 
     "y" 
    ) 

    def __init__(self, obj, x, y): 
     super().__init__(obj, x=x, y=y) 

今操作を可能にする:

>>> b = Bar(x=3, y=4) 
>>> b.x 
3 
>>> # Etc. 

私は_Baseをたくさんサブクラス化する必要があるので、私はできるだけDRYこれを維持しようとしているクラスがconfig変数を実装するためにサブクラス化する必要があります。

+1

あなたはクラスにそれを設定していません。オブジェクトに設定しています。記述子はそのようには機能しません。 –

答えて

2

propertyオブジェクトはdescriptorsであり、記述子はクラスまたはメタクラスで定義されたときにのみ呼び出されます。インスタンスに直接置くことはできません。クラスのための__getattribute__実装は、単に必要なバインディング動作を呼び出さない。

あなたはクラスではなく、各インスタンスにプロパティを配置する必要があります。

class Foo: 
    def __init__(self, x): 
     self._x = x 

    @property 
    def x(self): return self._x 

    @x.setter 
    def x(self, y): self._x = y 

あなただけのいくつかのインスタンスで動作特性を持っている必要があります場合は、あなたのgetterメソッドとsetterを変更する必要があります振る舞いを変える方法(インスタンスの状態が属性が存在しないような場合にはAttributeErrorをつけるなど)。

class Bar: 
    def __init__(self, has_x_attribute=False): 
     self._has_x_attribute = has_x_attribute 
     self._x = None 

    @property 
    def x(self): 
     if not self._has_x_attribute: 
      raise AttributeError('x') 
     return self._x 

    @x.setter 
    def x(self, y): 
     if not self._has_x_attribute: 
      raise AttributeError('x') 
     self._x = y 

propertyオブジェクトはまだ存在して結合しているが、フラグがfalseに設定されている場合、属性が存在しないかのように振る舞います。

+0

私はちょうど私の試みがどれほど愚かなのか気づいた。ありがとう。 –

関連する問題