PythonDay 09---モジュール、オブジェクト向けプログラミング

5327 ワード

Pythonのモジュール
一、モジュール
1.モジュールの概要
説明:Pythonで、一つ.pyファイルはモジュール(Module)と呼ばれます.メリット:(1)コードのメンテナンス性が向上しました.(2)コードの作成はゼロから始める必要はありません.他のモジュールの注意を参照してください.自分でモジュールを作成するときは名前に注意し、Pythonが持っているモジュール名と衝突してはいけません.たとえば、システムにはsysモジュールが付属しており、独自のモジュールはsys.pyと命名できません.そうしないと、システムに付属するsysモジュールをインポートできません.また、Python変数のネーミング仕様に従うには、中国語、特殊文字分類を使用しないでください:(1)モジュールを持参する(2)サードパーティモジュールを持参する(3)モジュールをカスタマイズする
二、オブジェクト向けプログラミング
1.クラスとインスタンス
eg:
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def informationOfStu(self):
        print('{}  {} !'.format(self.name, self.age))
        return
        
s = Student('wanhao', 18)
s.informationOfStu()

#  :
wanhao  18 !

説明:パラメータobjectは継承を示すインタフェースがobjectであり、関数__init__()はJavaのコンストラクション関数に相当し、クラスの各メソッド(コンストラクション関数を含む)の最初のパラメータはselfでなければならない.注意:特殊なメソッド「init」の前後にそれぞれ2つの下線がある!!変数がクラスのインスタンスであるかどうかを判断するにはどうすればいいですか?isinstance()関数で判断:eg:
class Student(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def informationOfStu(self):
        print('{}  {} !'.format(self.name, self.age))
        return
        
s = Student('wanhao', 18)
print(isinstance(s, Student))
#  :
True

2.アクセス権
pythonの変数とメソッドへのアクセス権は、公有、保護、プライベートの3つです.公有: 保護されている:_ 私有:__ __実際に共有されているのと保護されているのは形式的に少し異なるだけで、公有は正常な命名で、保護されているのは_ で、つまり変数命の前に_を加えて、他の面では完全に同じです(内部メカニズムを含む).この方法は文法上のルールではなく、単一の下線の先頭の属性と方法は外部からアクセスできるので、プログラマーに注意して操作するように指示する暗示や隠喩が多い.
説明:クラスのグローバル変数がプライベート属性として定義されていない場合、外部でクラスの内部属性egを変更できます.
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def informationOfStu(self):
        print('{}  {} !'.format(self.name, self.age))
        return
        
s = Student('wanhao', 18)
print(s.name)
s.name = 'li'
print(s.name)

#  :
wanhao
li

クラスの属性をプライベート属性として定義したい場合は、変数を導入する際に、変数の前に2つの下線__を付けてプライベート(他の位置の変数もそうである)を表す注意:Pythonでは、変数名が__xxx__に似ている、つまり2つの下線で始まり、2つの下線で終わる特殊変数であり、特殊変数は直接アクセス可能であり、private変数ではないので、__name____age__のような変数名は使用できません.eg:
class Student(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def informationOfStu(self):
        print('{}  {} !'.format(self.name, self.age))
        return
        
s = Student('wanhao', 18)
print(s.__name)

#  :
AttributeError: 'Student' object has no attribute '__name'

クラスのプライベート属性を取得または変更する場合は、Javaのようにget()set()関数を記述できます.
もっと言えば、Pythonは文法的にプライベート属性やメソッドのプライバシーを厳格に保証していません.プライベート属性やメソッドに名前を変えてアクセスを「妨げる」だけです.実際には、名前を変えるルールがまだアクセスできることを知っていれば、次のコードはそれを検証することができます.
class Student:
    def __init__(self, name):
        self.__name = name
        
    def run(self):
        print('{} is running!'.format(self.__name))
        
if __name__ == '__main__':
    s = Student('ZhangSan')
    print(s._Student__name)
    s.run()

#   :
ZhangSan
ZhangSan is running!
__name_Student__nameに変更しただけで
3.継承とマルチステート
継承構文:新しく定義されたクラスのパラメータは、そのクラスが継承するクラス(1)pythonの継承とJavaの継承がほぼ同じであり、親クラスのすべてのメソッドを継承することができます.異なるクラスは同じ親を継承し、親メソッドを書き換えます.これにより、継承によってマルチステートが生成されます.(2)pythonとJavaの継承の相違点:Animalクラスにrun()メソッドがあると仮定する)静的言語(例えばJava)にとって、Animalタイプを入力する必要がある場合は、Animalタイプまたはそのサブクラスでなければ、run()メソッドを呼び出すことはできません.Pythonのような動的言語では、必ずしもAnimalタイプに入力する必要はありません.伝達されたオブジェクトにrun()の方法があることを保証するだけでよい.(つまり書き換えられる方法が必要)
4.インスタンスクラス属性とクラス属性
(1)インスタンス属性説明:Pythonは動的言語であるため、インスタンス変数、またはself変数でインスタンスの属性を追加することができる.(2)クラス属性説明:クラスが持つ属性.Javaのようにクラスで定義された属性.eg:
class Student(object):
    age = 18 			#   
    def __init__(self, name, age):
        self.name = name  #self     name              ,  ,         ,      
        
s = Student('wanhao', 18)
print(s.name)
print(s.age)
s.scoer = 100               #scoer     
print(s.scoer)
print(Student.name)	
    
#  :
wanhao
18
100
AttributeError: type object 'Student' has no attribute 'name'   #  name     

注意:プログラムを作成するときは、同じ名前のインスタンス属性がクラス属性をブロックするため、インスタンス属性とクラス属性に同じ名前を使用しないでください.ただし、インスタンス属性を削除した後、同じ名前を使用すると、クラス属性にアクセスします.
5.selfについて簡単に説明する
selfはJavaのthisに相当し、クラスのインスタンス化オブジェクトを表します.
class Animal(object):
    def run(self):
        print(self)
        print("I am running!")
t = Animal()
t.run()
Animal.run(t)

#   :
<__main__.animal object="" at="">
I am running!
<__main__.animal object="" at="">
I am running!

以上のコードから分かるように、t.run()Animal.run(t)は完全に等価な2つの方法であり、実際には、実行中にt.run()Animal.run(t)文に変換して実行され、Animal.run(t)がパラメータを伝達する必要があることがわかり、伝達されたこのパラメータがインスタンス化対象である.したがって、各クラスのメソッドについて、最初のパラメータはselfである.