2016-08-24 12 views
1

Python 3の抽象プロパティのセッターだけをオーバーライドする最も単純で最もPythonの方法は何ですか?変種3は、派生クラスの実装者のための最小の労力を意味すると思われる。それが正しいか?それには欠点がありますか?Python 3のプロパティの抽象セッターをオーバーライドします。

import abc 


class A1(metaclass=abc.ABCMeta): 
    def __init__(self, x, **kwargs): 
     super().__init__(**kwargs) 
     self._x = x 

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

    @x.setter 
    @abc.abstractmethod 
    def x(self, value): 
     self._x = value 


class B1(A1): 
    @property 
    def x(self): 
     return super().x 

    @x.setter 
    def x(self, value): 
     print("B1 setter") 
     super(B1, self.__class__).x.fset(self, value) 

b1 = B1(x=1) 
b1.x = 3 
print(b1.x) 


class A2(metaclass=abc.ABCMeta): 
    def __init__(self, x, **kwargs): 
     super().__init__(**kwargs) 
     self._x = x 

    @abc.abstractmethod 
    def _get_x(self): 
     return self._x 

    @abc.abstractmethod 
    def _set_x(self, value): 
     self._x = value 

    x = property(_get_x, _set_x) 


class B2(A2): 

    def _get_x(self): 
     return super()._get_x() 

    def _set_x(self, value): 
     print("B2 setter") 
     super()._set_x(value) 

    x = property(_get_x, _set_x) 

b2 = B2(x=1) 
b2.x = 3 
print(b2.x) 


class A3(metaclass=abc.ABCMeta): 
    def __init__(self, x, **kwargs): 
     super().__init__(**kwargs) 
     self._x = x 

    def _get_x(self): 
     return self._x 

    @abc.abstractmethod 
    def _set_x(self, value): 
     self._x = value 

    x = property(
     lambda self: self._get_x(), 
     lambda self, value: self._set_x(value)) 


class B3(A3): 

    def _set_x(self, value): 
     print("B3 setter") 
     super()._set_x(value) 


b3 = B3(x=1) 
b3.x = 3 
print(b3.x) 

答えて

0

だから、はい、あなたはそこに多くの方法が記載されている - と、より多くのコードを必要とするものは、あなたのバリアント3ですが、それを行うための最もstraighforard、少なくとも意外な方法は、1バリアントである -

これはうまく動作し、完全に読み取り可能で、驚きはありません。fgetを明示的に呼び出すより簡単な方法はないようです。

関連する問題