2016-11-20 19 views
0

私のクラスのプライベート変数を抽象クラスにする正しい方法は何か知りたい。抽象クラスとしてプライベート変数を定義する

from abc import ABCMeta 

class AbstractClass(ABCMeta): 
    __private_abstract_property = None # Needs this as private abstract class variable 
    # ... some functions 


class ParentClass(AbstractClass): # inherits `AbstractClass` 
    # .. some more functions 


class ChildClass1(ParentClass): # inherits `ParentClass` 
    __private_abstract_property = 'value1' # value to be initialized here 


class ChildClass2(ParentClass): # inherits `ParentClass` 
    __private_abstract_property = 'value2' 

正しい方法は何ですか:私のクラスの

  • クラス変数
  • プライベート
  • 抽象

構造が似ている:私は私の変数の性質をまとめてみようこれを達成するには? Abstract Attributes in Pythonへの回答で述べたようにそれとも、

class AbstractClass(ABCMeta): 
    @abstractproperty 
    def __private_abstract_property(self): 
     ... 

を::

class AbstractClass(ABCMeta): 
    __private_abstract_property = NotImplemented 

私は(このいずれかのアプローチを達成するための正しい方法を知りたい

一つの方法は、としてabc.abstractpropertyデコレータを使用することです私が言及したことから離れてさえ歓迎される)。


編集:ここではは私が何をしようとしています何のいくつかの説明です:

  • 私はデータベースに関連するいくつかの集合演算を持つ管理者AbstractClassを持っています。私はこのクラスの直接のオブジェクトを望んでいないので、抽象的でなければなりません。また、定義のない関数をいくつか持っています。

  • ParentClassは、AbstractClassに由来します。それはデータベースから特定の項目を取り出すことに関係するいくつかの機能セットを有するでしょう。このクラスも、やはり扱っているデータベースについて知らない。

  • ChildClassは、実際に対話する必要のあるデータベースエンジンを備えています。同じ種類の情報を保持する異なるエンジンが存在する可能性があるので、ここで接続名を設定し、この接続に基づいて、ParentClassの関数はデータベースから情報を取得します。また、ChildClassは、PythonでプライバシモデルはありませんParentClass

+2

これは、[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように、JavaをPythonで記述しようとしたときに発生します。どのような課題を達成しようとしていますか? – TigerhawkT3

+0

@ TigerhawkT3質問で編集しました –

答えて

3

とは別に、追加の機能を持つことができます。ダブルアンダースコアの名前は、JavaまたはC#の名前がプライベートであるという意味ではプライベートではありません。そのような名前はプライベートです。

クラスプライベートは、サブクラス内での偶発的なオーバーライドから保護されていることを意味します(名前の前にクラス名が付加されます)。つまり、は、抽象クラスに二重アンダースコアの名前を入れている点は全くありません。です。サブクラスはまったく同じ名前を使うべきではありません。

__*
クラスのプライベート名:

は、リファレンスドキュメントのReserved classes of identifiers section一部を参照してください。このカテゴリの名前は、クラス定義のコンテキスト内で使用されると、ベースクラスと派生クラスの「プライベート」属性間の名前の衝突を避けるために、変更されたフォームを使用するように書き直されます。

何でもを抽象基本クラスに非公開にしてはいけません。 ABCはインタフェースに類似しており、公開の APIサブクラスが提供すべきであることを文書化しています。

単一のの先頭にアンダースコア(名前では内部実装の一部であり、他の実装や将来のバージョンでは利用できないことを伝えるシグナリング)これらはABCの一部であってはならない。サブクラスが禁止されているメソッドとプロパティをどのように実装するかを決める抽象基本クラスの範囲ではありません。

+0

大丈夫ですが、公用変数(慣習的に)を使っても大丈夫なら '@ abstractproperty'プロパティデコレータを使用する必要がありますか? –

+1

@MoinuddinQuadri:はい、あなたは '@ abstractproperty'で属性を欲しいと文書化できます。 '@ abstractmethod'と' @ abstractproperty'の両方について、物事がどのように実装されているのかということは強制されていないことに注意してください。 –

+0

しかし、その場合はインスタンス変数になりますが、私はそれをクラス変数にします。私は最後に質問の編集をしました。私がしようとしていることを理解するのに役立つかもしれません。 –

関連する問題