Pythonオブジェクト指向の例


-王玉陽まとめ(Code_boy)2018年11月16日

1 classPerson:2     name='xxx'3     age=2045 p=Person()  #pはインスタンスオブジェクトです
 6 print(p.name,p.age)7 p.name="yyy"8 p.gender='male'9print(p.name,p.gender,p.age)10print(Person.name,Person.age)

p(インスタンスオブジェクト)は、値を変更するためのPersonクラスのコンテンツには影響しません。

Person.age='30'
print(Person.age)

class Person(class)変更する価値がある場合、Personクラスのコンテンツが影響を受けます

'''

アクセス許可(クラスの属性)

'''
クラス人:#人の名前と年齢は公開されています
name = 'james'
age=20

プライベートになるために前に2つのアンダースコアを追加することがpythonで規定されています

'''
'''
class Person:
__ name = 'james' #private __name
age = 20

def show(self):#self >>自分
print(self .__ name、self.age)#自分にアクセスして、通常どおりに戻る

p=Person ()
p.show()#show()関数以外を呼び出す必要があります。そうしないと、クラスでのshowの実行が拒否されます。
print(Person .__ name)#クラス内のプライベート属性へのアクセスが異常に返される
print(p.age)

プライベート関数呼び出しがある場合も同じです。プライベート関数、要素はクラスでのみ使用できます

一般的に使用される方法は、パブリック関数を呼び出すことにより、関数内のプライベートプロパティの呼び出しを実行することです。

'''

ケース:個人情報の書き込みとオブジェクトアクセス属性の確立

1 classPerson:2     name ='xxx'3     gender ='x'4     age =056 p=Person()7print(p.name,p.gender,p.age)8print(Person.name,Person.gender,Person.age)910 p.name ='A'11 p.gender ='Male'12 p.age =201314 Person.name ='B'15 Person.gender ='Female'16 Person.age =211718print(p.name,p.gender,p.age)    #pインスタンスオブジェクトのプロパティ
19 print(Person.name,Person.gender,Person.age) #個人クラスの属性

インスタンス方式

'''

1 classPerson:2     age =203     def show(self):4print(self.age)56 p.Person()

インスタンスメソッドには少なくとも1つのパラメーターがあり、通常はパラメーターとして(self)という名前の変数があります(名前はカスタマイズできます)

インスタンスメソッドは、インスタンスオブジェクトを介して呼び出されます(例:p.show())。

クラス名を使用して呼び出す場合は、インスタンスパラメータを手動で渡す必要があります(例:Person.show(p))。

インスタンスメソッドが呼び出され、インスタンスオブジェクトが最初のパラメータに渡されます

1 classPerson:2     name ='james'3     age =1245     def getName(self):6return self.name
 78  def getAge(self):9return self.age
1011 p=Person()12print(p.getName(),p.getAge())   #インスタンス属性オブジェクト呼び出し
13 print(Person.getAge(p)) #クラス名の呼び出し
1 def show(self,s):   #パラメータの受け渡し
2 print(self,s)34 p.show('hi')    #'hi'sに渡される値
5 Person.show(p,'hello')  #こんにちは'''

クラスメソッド

1 classPerson:2     age =203     @classmethod
4  def show(cls):5print(cls.age)67 p=Person()

クラスメソッドは@classmethodで装飾する必要があり、最初のパラメーターは通常clsという名前です(他の名前を指定できます)

クラスメソッドは通常、クラスの名前を使用して呼び出されます。例:Person.show()

クラスメソッドは、インスタンスメソッドから呼び出すこともできます。例:p.show()

クラスメソッドが呼び出されると、クラスの名前が最初のパラメーターに渡されます

1 classPerson:2     __name ='james'3     __age =1245     @classmethod
 6  def show(self):7print(self)8print(self.__name,self.__age)910 Person.show()11 p=Person()12 p.show()'''

静的メソッド

'''
定義:

1 classPerson:2     age =203     @staticmethod
4  def show():5print(Person.age)67 p =Person()

静的変数関数は@staticmethodによって変更されます

通常、クラスの名前またはインスタンスは、静的メソッドを呼び出すために使用されます(例:Person.show()、p.show())。

静的関数を呼び出すときに、パラメーターは関数に渡されません

1 classPerson:2     __name ='james'3     __age =1245     @staticmethod
 6  def show():     #パラメータなしで静的
 7 print(Person.__name)89 p =Person()10 Person.show()11 p.show()

クラス、インスタンス、静的メソッドは異なります-Person

1 classPerson:2     name ='xxx'3     gender ='x'4     age =05                     #インスタンス方式
 6  def instanceShow(self):7print(self.name,self.gender,self.age)89     @classmethod    #クラスメソッド
10  def classShow(cls):11print(cls.name,cls.gender,cls.age)1213     @staticmethod   #静的メソッド
14  def staticShow():15print(Person.name,Person.gender,Person.age)161718 p=Person()19 p.instanceShow()        #インスタンスメソッドの呼び出し
20 Person.classShow()      #クラスメソッド呼び出し
21 Person.staticShow()     #静的メソッド呼び出し

インスタンスメソッドは通常、インスタンスオブジェクトで呼び出されます
クラスメソッドと静的メソッドは通常、クラス名で呼び出されます

オブジェクトの初期化

'''
構築方法(関数)...>完全な関数の初期化
@ コンストラクター__init __(self、...)は、オブジェクトが生成されるときに呼び出されます。
一部の初期化操作を実行するために使用できます。呼び出すために表示する必要はありません。システムはデフォルトで実行されます
ユーザーが構築方法を定義しない場合、システムはデフォルトの構築方法を単独で実行します
__ init __(self)は、オブジェクトが生成されるときに呼び出されます
__ del __(self)は、オブジェクトが解放されたときに呼び出されます

1 classPerson:2     def __init__(self,n,a):3         self.name=n
4   aelf.age=a
56 p=Person('xxx',20)7print(p.name,p.age)

@ オブジェクトが解放されると、デストラクタメソッド__del __(self)が呼び出され、その中でリソースを解放するためのいくつかの操作を実行できます。
電話をかける必要はありません

1 classPerson:2     def __init__(self,n,a):3         self.name = n
 4   self.age = a
 5  def __del__(self):6print('__del__',self.name,self.age)78 p=Person('xxx',20)9print(p.name,p.age)1011classPerson:12     def __init__(self):13print("__init__",self)14     def __del__(self):15print("__del__",self)1617 p=Person()

#__ init__完全なオブジェクトの初期化

1 classPerson:2     def __init__(self,n,g,a):       #n,g,参照ユニット
 3   self.name = n
 4   self.gender = g
 5   self.age = a
 67  def show(self):8print(self.name,self.gender,self.age)910 p=Person('james','male',20)     #pオブジェクトが決定された後、pオブジェクトの初期化(n、a、m)が完了します。
11 p.show()

Pythonの規定:クラスには1つのコンストラクターしか存在できません

#...__ init__でデフォルトのパラメータを設定します

1 classPerson:2     def __init__(self,n='',g='male',a=0):3         self.name = n
 4   self.gender = g
 5   self.age = a
 67  def show(self):8print(self.name,self.gender,self.age)910 a =Person('james')11 b =Person('james','fenmale')12 c =Person('james','male',20)13 a.show()    #結果:ジェームズ男性014 b.show()    #結果:ジェームズフェンマレ015 c.show()    #結果:ジェームズ男性2016# __init__パラメータにデフォルト値が設定されている場合、新しいコンテンツが渡された後、元の値が上書きされます。'''

ケース:日付クラスMyDate

1 classMyDate:2     __months =[0,31,28,31,30,31,30,31,31,30,31,30,31]3     def __init__(self,y,m,d):4if(y<0):5print("Error:無効な年")6if(m<1 or m>12):7print("Error:無効な月")8if(y%400==0 or y%4==0 and y%100!=0):9             MyDate.__months[2]=2910else:11             MyDate.__months[2]=281213if d<1 or d>MyDate.__months[m]:14print("Error:無効な日付")15         #日付、月、年がすべて合法になった後、クラスの属性(コンテンツ)を作成します
16   self.year = y
17   self.months = m
18   self.day = d
19  def show(self,end='\n'):20print("%d-%d-%d"%(self.year,self.months,self.day),end = end)2122 p =MyDate(2018,11,19)23 p.show()

クラスの継承

派生と継承:学生:名前性別年齢

1 classPerson:2     def __init__(self,name,gender,age):3         self.name = name
 4   self.gender = gender
 5   self.age = age
 67  def show(self,end='\n'):8print(self.name,self.gender,self.age)910classStudent(Person):11     def __init__(self,name,gender,age,major,dept):12         Person.__init__(self,name,gender,age)13         self.major = major
14   self.dept = dept
1516  def show(self):17         Person.show(self,'')18print(self.major,self.dept)1920 s =Student('james','male',20,'softwart','computer')21 s.show()222324'''
25 結果:
26 james male 2027 softwart computer
28'''

継承されたクラスコンストラクター:

上記のStrdentクラスの定義から、派生クラスのコンストラクターに加えて、独自の新しい追加を完了することがわかります。
majorプロパティとdeptプロパティの初期化に加えて、基本クラスのPersonコンストラクターを呼び出し、その呼び出しを表示する必要があります。
すなわち:Person .__ init __(self、neme、gender、age)
Personの__init__関数をクラス名Personから直接呼び出し、必要な4つの関数を提供します
基本クラスのコンストラクターは、クラスが継承されたときに自動的に呼び出されることはなく、呼び出しを表示する必要があります

属性メソッドの継承:

基本クラスにインスタンスメソッドがある場合、継承されたクラスにまったく同じインスタンスメソッドを再定義できます。
たとえば、Personにはshowメソッドがあり、Studentには同じshowメソッドがあります。混乱することはありません。
StudentクラスのショーはPersonのショーをオーバーライドすると呼びます
-もちろん、基本クラスのインスタンスメソッドもオーバーライドできません。派生クラスはこの基本クラスのインスタンスメソッドを継承します。

1 classPerson:2     className ='Person'    #独自のインスタンス属性
 3  def __init__(self,name,gender,age):4         self.name = name
 5   self.gender = gender
 6   self.age = age
 78  def show(self,end='\n'):9print(self.name,self.gender,self.age)1011     @classmethod        #クラスメソッドの変更
12  def classClassName(cls):13print(cls.className)1415     @staticmethod       #静的メソッド装飾
16  def staticClassName():17print(Person.className)1819     def display(self):20print('display')2122classStudent(Person):23     #className ='Student'24     def __init__(self,name,gender,age,major,dept):25         Person.__init__(self,name,gender,age)26         self.major = major
27   self.dept = dept
2829  def show(self):30         Person.show(self,'')31print(self.major,self.dept)3233 s =Student('A','male',20,'software','computer')34 s.show()35print(Student.className)    #学生自身がいない場合は、上位レベル(人)が表示されます
36 Student.classClassName()37 Student.staticClassName()3839 s.display() #インスタンス呼び出し
404142 # 結果の説明:Studentは、Personのインスタンス、静的、およびクラス(属性)メソッドを継承します
43 # 結果:
44'''
45 A male 2046 software computer
47 Person
48 Person
49 Person
50 display
51'''

ケース:年、月、日+時間、分、秒

1 classMyDate:2     __months =[0,31,28,31,30,31,30,31,31,30,31,30,31]3     def __init__(self,y,m,d):4if(y<0):5print("Error:無効な年")6if(m<1 or m>12):7print("Error:無効な月")8if(y%400==0 or y%4==0 and y%100!=0):9             MyDate.__months[2]=2910else:11             MyDate.__months[2]=281213if d<1 or d>MyDate.__months[m]:14print("Error:無効な日付")15         #日付、月、年がすべて合法になった後、クラスの属性(コンテンツ)を作成します
16   self.year = y
17   self.months = m
18   self.day = d
19  def show(self,end='\n'):20print("%d-%d-%d"%(self.year,self.months,self.day),end = end)2122classMyDateTime(MyDate):23     def __init__(self,y,mo,d,h,mi,s):24         MyDate.__init__(self,y,mo,d)25if(h<0  or  h>23  or  mi<0  or  mi>59  or  s<0  or  s>59):26print("Error:無効な時間")27         self.hour = h
28   self.minute = mi
29   self.second = s
3031  def show(self):32         MyDate.show(self,'\t')33print("%d:%d:%d"%(self.hour,self.minute,self.second))343536 p =MyDateTime(2018,11,19,21,21,54)37 p.show()3839 #結果:2018-11-1921:21:54

Recommended Posts

Pythonオブジェクト指向の例
Pythonオブジェクト指向の基本
Pythonオブジェクト指向の魔法の方法
Python3.7デバッグサンプルメソッド
Python補間補間の例
Pythonの負の弾性率の操作例
Python3ロギングログパッケージの例
Python正規式サンプルコード
Python出力数学記号の例
Pythonオブジェクト指向プログラミングの分析
Python反復可能オブジェクトの重複排除の例
Python一次元二次元補間の例
pythonのオブジェクト指向とは何ですか
Pythonドローバーグラフ(バーグラフ)の例
Pythonの右揃えの例の方法
Pythonウォーターフォールラインインジケーターの作成例
Pythonリスト理解操作例の概要
PythonATM関数の実装コード例
IV値を計算するPythonの例
Pythonデコレータの簡単な使用例の概要
pythonアクセスAlipayの操作例
pythonオブジェクト指向プログラミングを理解する方法
Pythontcp伝送コードの例の分析
Pythonリクエストモジュールセッションコード例
Python検証コード傍受識別コードの例
Pythonマルチスレッド
Python FAQ
Python3辞書
Python3モジュール
python(you-get)
Python文字列
Pythonの基本
Python記述子
Pythonの基本2
Python exec
Pythonノート
Python3タプル
CentOS + Python3.6 +
Python Advanced(1)
Pythonデコレータ
Python IO
Pythonツールチェーン
アニメのスクリーンショットを取得するためのPythonクローラーの例
Pythonマルチタスク-日常
Pythonの概要
pythonの紹介
1分でPythonを学ぶ|オブジェクト指向(中国語)
Pythonアナリティック
Pythonの基本
派生物を計算してプロットするpythonの例
07.Python3関数
Pythonの基本3
pythonからsqlを読み取る方法の例
Pythonマルチタスクスレッド
Python関数
python sys.stdout
音楽ファイルを開くためのPythonのサンプルメソッド
python演算子
Pythonエントリ-3
Centos 7.5 python3.6
Python文字列