Python開発基盤-Day 17オブジェクト向けプログラミング紹介、クラス、オブジェクト

32728 ワード

オブジェクト向けに紹介になる
プロセス向けプログラミング
核心は過程(流水線式思考)であり、過程は問題を解決するステップであり、過程に向かう設計は流水線を丹念に設計し、周到にいつ何を処理するかを考えるのと同じである.主な応用はlinuxカーネル、git、apacheサーバなど、修正が少ない場所で行われます.
利点:プログラムの設計の複雑さを大幅に低減
欠点:拡張性が悪く、一つの場所を変えるには複数の場所を変える可能性が高く、一発で全身を動かす.
オブジェクト向けプログラミング:プログラミングのすべてではなく、ソフトウェアの拡張性を解決するために使用されます.
コアはオブジェクト(神的な思考)であり、オブジェクトはプログラムの基本単位として、データと操作データの関数を含むオブジェクトである.オブジェクト向けとは、コンピュータプログラムを1つのオブジェクトの集合として、オブジェクトごとに他のオブジェクトからのメッセージを受信することであり、コンピュータプログラムの実行は、一連のメッセージが各オブジェクト間で伝達されることである.主に需要が常に変化するソフトウェアに応用され、一般的な需要の変化はユーザー層、インターネット応用、企業内部ソフトウェア、ゲームなどに集中している.
利点:プログラムの拡張性が悪いという問題を解決し、あるオブジェクトに対する修正はすぐにlolの英雄属性に対する修正(万年弱体化は強化されていない)などのプログラムシステム全体に反映されます.
欠点:制御性が悪く、lol毎ゲームの結果などのプログラム実行結果を予測できない
クラスとオブジェクト
オブジェクトの概念
オブジェクトはインスタンスとも呼ばれ、クラスによって生成され、オブジェクトはデータ属性とメソッド属性の結合体であり、例えばlolの中の英雄、1人の英雄は1つのオブジェクトであり、生命値、青い攻撃力などのデータ属性を備え、qwerの4つの技能を備えてメソッド属性に属する.
クラスの概念
クラスにはオブジェクトの同じ属性部分が含まれているか、lolの中の英雄なのか、すべての英雄には名前、ラベル(戦車戦士法師)、生命値、青い攻撃力などがあり、具体的な値は異なるが、クラスに含めて生成することができる.
pythonでは、変数でデータ属性を表し、メソッド属性を関数で表します.
現実の生活の中で、まず対象があって後に類があって、例えば先にある人、後にある人類の概念、プログラミングの中で、先にある類、後にある対象、類は対象を生成します.
クラスの宣言:関数の定義と類似
定義関数ていぎかんすう:defキーで
1 def functionName(args):
2      '       '
3           

クラスの定義:clessキーワードで、クラスの名前は一般的に大文字で、関数と区別するために
1 '''
2 class   :
3     '       '
4       
5 '''
6 #       Data ,
7 class Data:
8     pass 

例:中国人のクラスを定義する
まず中国人の特徴を分析して、まず国籍は中国に属しなければならなくて、それからまた個人で、それでは人はすべて何をします(食べて飲んで寝て話をします)など、その他にすべての人は自分の特有の属性があって、例えば名前の身長の誕生日など
疑似コード分析(分析のみ):
chinese
#        
country='china' #    
language='chinese'  #     ,    、             
#     
def talk(self):
    print('is talking')
def eat(self):
    print('is eating')
def sleep(self):
    print('is eating')
def work(self):
    print('is working')
#            

#
name=name
age=age
sex=sex

コード定義:_init__関数とselfは以下に説明します.
 1 class Chinese:
 2     #
 3     country = 'China'
 4     language = 'chinese'
 5     # __init__(p1, 'zhangsan', 'man', 73)
 6     def __init__(self,name,sex,age):
 7         #        ,      ,         
 8         self.name=name #p1.name='zhangsan'
 9         self.sex=sex #p1.sex='man'
10         self.age=age #p1.age=73
11     #      
12     def talk(self):
13         print('is talking')
14     def eat(self):
15         print('is eating')
16     def sleep(self):
17         print('is eating')
18     def work(self):
19         print('is working')

クラスの属性参照:
1 print(Chinese.__dict__)         #        Chinese     ,   dir(  )  
2 print(Chinese.language)         #  Chinese language  
3 print(Chinese.work)         #  Chinese work  
4 Chinese.language='putonghua'    #    language  
5 Chinese.complexion='yellow'     #        
6 del Chinese.complexion          #      

インスタンス化(インスタンスの生成):init__関数とselfの説明
1 p1=Chinese('zhangsan','man',73)     #      ,name='zhangsan'  sex='man'  age=73
2 print(p1.__dict__)       #        p1   ,         ,  name/sex/age

クラス名に括弧を付けるとインスタンス化されたプロセスであり,p 1というオブジェクトが生成される.
1 print(p1.__dict__,type(p1))
2 #     
3 {
     'name': 'zhangsan', 'sex': 'man', 'age': 73} <class '__main__.Chinese'>

p1.__dict__出力の結果は_init__関数の実行結果init__関数の位置パラメータは4つのself,name,sex,age,インスタンス化の過程で'zhangsan','man',73の3つのパラメータがname,sex,ageに対応し,selfも1つの位置パラメータであり,関数部分では位置パラメータが値を入力しなければならないことを知っており,ここでコードは自動的に値p 1,すなわちインスタンスの名前p 1を入力する.
一方,p 1のタイプは,Chineseのタイプを見るとp 1と同様,すなわちクラスを定義すること,すなわちタイプを定義することである.
オブジェクトの属性参照:
1 print(p1.language)      #p1     language  ,      ,        ,         
2 # print(p1.run())       #  ,              
3 print(p1.work())
4 p1.city='beijing'       #      ,         ,    p1      ,   Chinese   
5 del p1.city             #      

結論:
クラスのデータ属性は削除して変更することができます
オブジェクトのデータ属性を削除して変更できます
オブジェクト自体には関数属性はなく、独自のデータ属性(_init__関数が初期化された属性または手動で追加された属性)しかありませんが、クラス呼び出しで、共通の特徴と属性を呼び出すことができます.
オブジェクトに共通するデータと関数は参照クラスの名前空間です
オブジェクトのプロパティは、自分の__から優先されます.dict__辞書で探して、もし自分の辞書の中にないならば、クラスの中にアクセスして、もしクラスの中にもないならば、間違いを報告して、自分で定義した属性は他の引用したクラスの同じ属性に対して影響がありません
オブジェクトの使用方法:
class Chinese:
    obj_list=[]
    count=0
    country = 'China'
    language = 'chinese'
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.age=age
        self.obj_list.append(name)  #     ,    pbj_list       
        self.count+=1          #     ,    count+1
    def sleep(self):
        print('is eating')
    def work(self):
        print('is working')
p1=Chinese('bob','man',18)
p2=Chinese('natasha','woman',28)
p3=Chinese('hurry','man',10)
print(p1.obj_list,p1.__dict__)
print(p2.obj_list,p2.__dict__)
print(p3.obj_list,p3.__dict__)
print(Chinese.obj_list)
#######    #######
print(p1.count,id(p1.count))
print(p2.count,id(p2.count))
print(p3.count,id(p3.count))
print(Chinese.count,id(Chinese.count))

    :
['bob', 'natasha', 'hurry'] {
     'name': 'bob', 'sex': 'man', 'age': 18, 'count': 1}
['bob', 'natasha', 'hurry'] {
     'name': 'natasha', 'sex': 'woman', 'age': 28, 'count': 1}
['bob', 'natasha', 'hurry'] {
     'name': 'hurry', 'sex': 'man', 'age': 10, 'count': 1}
['bob', 'natasha', 'hurry']
1 1818604608
1 1818604608
1 1818604608
0 1818604576

その結果、各インスタンスにobj_がないことが分かった.list、しかしcountがあって、1つは可変で、1つは可変で、だからクラスの中で可変なデータobj_Listは直接変更でき、メモリidは変更されず、可変データcountは再計算され、クラスの属性ではなくオブジェクトの属性に基づいて新しいメモリ空間を開いて参照することができます.
 1 class Chinese:
 2     obj_list=[]
 3     count=0
 4     country = 'China'
 5     language = 'chinese'
 6     def __init__(self,name,sex,age):
 7         self.name=name
 8         self.sex=sex
 9         self.age=age
10         Chinese.obj_list.append(name)  #     ,Chinese   obj_list         
11         Chinese.count+=1    #     ,Chinese  count+1
12     def sleep(self):
13         print('is eating')
14     def work(self):
15         print('is working')
16 p1=Chinese('bob','man',18)
17 p2=Chinese('natasha','woman',28)
18 p3=Chinese('hurry','man',10)
19 print(p1.obj_list,p1.__dict__)
20 print(p2.obj_list,p2.__dict__)
21 print(p3.obj_list,p3.__dict__)
22 print(Chinese.obj_list)
23 #######    #######
24 print(p1.count,id(p1.count))
25 print(p2.count,id(p2.count))
26 print(p3.count,id(p3.count))
27 print(Chinese.count,id(Chinese.count))
28 
29     
30 ['bob', 'natasha', 'hurry'] {
     'name': 'bob', 'sex': 'man', 'age': 18}
31 ['bob', 'natasha', 'hurry'] {
     'name': 'natasha', 'sex': 'woman', 'age': 28}
32 ['bob', 'natasha', 'hurry'] {
     'name': 'hurry', 'sex': 'man', 'age': 10}
33 ['bob', 'natasha', 'hurry']
34 3 1818604672
35 3 1818604672
36 3 1818604672
37 3 1818604672

その結果、インスタンス化の過程でクラス自体が行った属性変更操作は、オブジェクトに何の影響も与えず、すべてのオブジェクトにcount属性とobj_が含まれていないことが分かった.listプロパティは、クラスによって呼び出されます.
 1 class Chinese:
 2     country = 'China'
 3     language = 'chinese'
 4     def __init__(self,name,sex,age):
 5         self.name=name
 6         self.sex=sex
 7         self.age=age
 8     def sleep(self):
 9         print('%s is eating' %self.name)
10     def work(self):
11         print('%s is working' %self.name)
12 p1=Chinese('bob','man',18)
13 p2=Chinese('natasha','woman',28)
14 # Chinese.work()    #  TypeError
15 p1.work()
16 p2.work()
17 #    
18 bob is working
19 natasha is working

その結果,クラスで定義された関数はオブジェクトにのみ用いられ,クラス自体ではこれらの関数は使用できないことが分かった.クラス定義はメソッドのみで、メソッドはオブジェクトにバインドされます.
 
転載先:https://www.cnblogs.com/zero527/p/7094414.html