pythonオブジェクト向け(下)


継承
継承は、ベースクラスの属性が派生クラスにどのように「遺伝」されるかを記述します.サブクラスは、データ属性やメソッドにかかわらず、ベースクラスの任意の属性を継承できます.サブクラスを作成する構文は、通常の(新しい)クラスと区別されないように見えます.1つのクラス名の後に、1つ以上の派生する必要がある親が続きます.
class SubClassName (ParentClass1[, ParentClass2, ...]):
    'optional class documentation string'
    class_suite

≪インスタンス|Instance|emdw≫
class Parent(object): # define parent class     
    def parentMethod(self):
    print 'calling parent method'

class Child(Parent): # define child class     
    def childMethod(self):
    print 'calling child method'

継承と上書き
継承
Javaとは異なり、pythonのサブクラスが親を継承すると、コンストラクタinit()を含む親のすべての方法が継承されます.
class Parent():
    def __init__(self):
        print "init Parent class instance"

    def func(self):
        print "call parent func"

class Child(Parent):
    def __init__(self):
        print "init Child class instance"

child = Child()
child.func()

しゅつりょく
init Child class instance call parent func
superキーワード
superは多重継承問題を解決するために用いられ,直接クラス名で親を呼び出す方法は単一継承を用いる場合には問題ないが,多重継承を用いるとルックアップ順序(MRO),繰返し呼び出し(ダイヤモンド継承)など様々な問題に関与する.文法は次のとおりです.
super(type[, obj])
class C(B):
    def method(self, arg):
        super(C, self).method(arg)

に注意
super継承は新式クラスにのみ使用でき,古典クラスに使用するとエラーが報告される.新しいクラス:継承するクラスが必要です.継承したいクラスがなければ、objectクラシッククラスを継承します.親クラスがありません.super()argument 1 must be type,not classobjを呼び出すとエラーが発生します.
≪インスタンス|Instance|emdw≫
class Parent(object):
    def __init__(self):
        self.phone = '123456'
        self.address = 'abcd'

class Child(Parent):
    def __init__(self):
        super(Child, self).__init__()
        self.data = 100

def main():
    child = Child()
    print "phone is: ", child.phone
    print "address is: ", child.address
    print "data is: ", child.data

if __name__ == '__main__':
    main()

しゅつりょく
phone is:  123456
address is:  abcd
data is:  100

書き換える
子クラスは、親クラスのメソッドと同じ名前のメソッドを再定義すれば、親クラスを上書きするメソッドを書き換えることができる.子類は前例の親類のfunc(self)を書き直せばよい.
class Parent():
def __init__(self):
print "init Parent class instance"
def func(self):
print "call parent func"
class Child(Parent):
def __init__(self):
print "init Child class instance"

child = Child()
child.func()

しゅつりょく
init Child class instance
call Child func

多重継承
C++と同様に、Pythonはサブクラスが複数のベースクラスを継承することを許可する.しかし、多重継承は一般的に推奨されない.構文は次のとおりです.
class Father():
    def __init__(self):
        print "init Father instance"

class Mother():
    def __init__(self):
        print "init Mother instance"

class Child(Father, Mother):
    pass

クラス、インスタンス、その他のオブジェクトの組み込み関数
issubclass()
ブール関数は、1つのクラスが別のクラスのサブクラスまたは子孫クラスであると判断します.次の構文があります.
issubclass(sub, sup)
isinstance()
ブール関数は、オブジェクトが別の所与のクラスのインスタンスであるかどうかを判定する場合に便利です.次の構文があります.
isinstance(obj1, obj2)
attr()シリーズ関数
  • hasattr()その目的は、オブジェクトに特定の属性があるかどうかを決定することであり、通常、ある属性にアクセスする前にチェックするために使用されます.
  • getattr()およびsetattr()getattr()およびsetattr()関数は、オブジェクトに割り当てられた属性を取得および付与します.
  • delattr()特定の属性を削除
  • ≪インスタンス|Instance|emdw≫
    class Child(Parent):
        def __init__(self):
            self.data = 100
    
    child = Child()
    print "has data attr?", hasattr(child, 'data')
    
    print "delete attr"
    delattr(child, 'data')
    
    print "has data attr?", hasattr(child, 'data')
    
    print "set data attr to 200"
    setattr(child, 'data', 200)
    print "data attr is: ", getattr(child, 'data')

    しゅつりょく
    has data attr? True
    delete attr
    has data attr? False
    set data attr to 200
    data attr is: 200

    私有化
    PythonはJavaのように本格的なパッケージを実現するのではなく、二重スクライブと単スクライブで私有化を実現する.
  • 二重スクライブは外部アクセスを防止する.funcの前に二重スクライブを付けると、サブクラスを含むインスタンスへのアクセスが防止される.
  •     def __func(self):
            print "call"
  • スクライブ防止モジュールのプロパティは「from mymodule import*」でロードされます.