class ABase(object):
@classmethod #クラス メソッド修飾子
def aclassmet(cls): print 'a class method for', cls.__name__
class ADeriv(ABase): pass
bInstance = ABase( )
dInstance = ADeriv( )
ABase.aclassmet( ) # 印刷: ABase のクラス メソッド
bInstance.aclassmet( ) # 印刷: ABase のクラス メソッド
ADeriv.aclassmet( ) # 印刷: ADeriv のクラス メソッド
dInstance.aclassmet( ) # 印刷: ADeriv のクラス メソッド
つまり、クラス メソッドは必要なく、通常の関数を使用してクラス メソッドの機能を実装することもできます。
4. クラスの継承 Python では、次のようにクラスを継承します。
class A(object) #Inherit object class
#....
class B(A) #Inherit class A
#....
また、Python は多重継承をサポートしています。多重継承の場合は、対応する関数を見つけて、その Python のような対応するメソッドがあります。 :
コードをコピー コードは次のとおりです:
class D(oject): pass #D はオブジェクト class B(D): #B は D のサブクラスです
varB = 42
def method1(self):
print "Class B : method1"
class C(D) : #Cこれも D のサブクラスです。
varC = 37
def method1(self):
print "Class C : method1"
def method2(self):
print "Class C : method2"
class A(B,C): #A は B および C のサブクラスです
varA = 3.3
def method3(self):
print "Class A : method3"
A.method1() を呼び出すとどうなりますか?答えは ClassB:method1 です。この本では次のように紹介されているだけです:
基底クラスで定義された属性を検索する場合、Python は深さ優先の原則を使用して、サブクラス定義内の基底クラスの順序で検索します。 **注意** (新しいスタイルのクラスではこの動作が変更されました)。上記の例では、A.varB にアクセスすると、A-B-D-C-D の順に検索が実行され、同じ属性を定義する基本クラスが複数ある場合は、最初に見つかったもののみが検索されます。属性値が使用されます:
5. データ非表示
Python でデータ非表示を実装するのは非常に簡単で、クラス変数名の前にキーワードを追加する必要はありません。このようにして、クラスのインスタンスの場合、その変数名とメンバー関数は使用できなくなり、継承されたクラスに対しても非表示になります。名前付けの競合を引き起こすことなく、まったく同じ変数名またはメンバー関数名を使用できます。
コードをコピーします コードは次のとおりです:
class A:
def __init__(self):
self.__X = 3 # self._A__X
クラス B(A):
def __init__(self):
A.__init__(self)
self.__X = 37 # self._B__X