研究ノートオブジェクト指向のPython -Python

 

オブジェクト指向技術の概要

  • クラス(クラス): 同一のプロパティとメソッドを有するオブジェクトの集合を記述するために使用されます。これは、各オブジェクトに共通のプロパティとメソッドのセットを定義します。オブジェクトは、クラスのインスタンスです。
  • クラス変数:クラス変数は、オブジェクトのインスタンス全体で共通しています。そして、クラス変数はクラス内の関数の本体の外に定義されました。クラス変数は通常、インスタンス変数として使用されていません。
  • データメンバー:クラス変数またはインスタンス変数、関連するデータ処理およびクラスインスタンスオブジェクトの。
  • メソッドが優先されます:あなたが親クラスからサブクラスの継承のニーズを満たすことができない場合は、書き換えることができ、このプロセスは、オーバーライドする方法として知られている方法(オーバーライド)、カバーと呼ばれています。
  • ローカル変数:プロセスで定義された変数、クラスの現在のインスタンスの役割のみ。
  • 変数の例:クラス宣言では、属性変数が示されています。この変数は、インスタンス変数と呼ばれますが、文は、クラス宣言内のクラスメソッドの他のメンバーに加えています。
  • 継承:であり、派生クラス(派生クラス)は、ベースクラス(基本クラス)フィールドとメソッドを継承します。継承はまた、処理された基底クラスのオブジェクトとしての派生クラスのオブジェクトを可能にします。例えば、そのような設計がある:オブジェクト・タイプが犬動物のクラスから派生し、アナログでの関係(図の実施形態では、動物犬)「(IS-)です」。
  • インスタンス化:クラス、特定のオブジェクトクラスのインスタンスを作成します。
  • 方法:クラスで定義された関数。
  • オブジェクト:クラスによって定義されるデータ構造例。オブジェクトは、2つのデータメンバ(インスタンス変数とクラス変数)および方法を含みます。

クラスを作成します

クラスは、クラス名と末尾にコロンの後に、新しいクラスを作成するには、クラスステートメントを使用します。

class ClassName:
   '类的帮助信息'   #类文档字符串
   class_suite  #类体由类成员,方法,数据属性组成。

ヘルプクラスは、クラス名.__ doc__内の例題で見ることができます。

以下は簡単な例Pythonクラスです:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '所有员工的基类' #类文档字符串
   empCount = 0    #类变量——所有实例之间共享
 
   def __init__(self, name, salary): #构造函数或初始化方法
      self.name = name               #self 代表类的实例;定义时必须存在,调用时不存在
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
  • empCount変数があるクラス変数は、その値がされ、このクラスになり、すべてのインスタンス間で共有しますあなたはできるクラスや外部のクラスに内部使用のEmployee.empCountにアクセスします

  • 第一の方法の__init __()メソッドは、クラスと呼ばれる、特別な方法であるコンストラクタまたは初期化メソッドメソッドが場合クラスのインスタンスときに呼び出されます

  • クラスに代わって自己の例自己定義されたクラスメソッドは、そこにあるものの、対応するパラメータがコールを渡す必要はありません。

自己のクラスではなく、クラスの代表例

唯一の特別な区別メソッドクラス通常の関数-彼らは余分に持っている必要があります最初の引数名をその名前が自己である慣例により(交換可能な、一貫性のあることが必要)。

class Test:
    def prt(self):
        print(self)    #运行结果:<__main__.Test instance at 0x10d066878>
        print(self.__class__)    #运行结果:__main__.Test
 
t = Test()
t.prt()

結果の上記の例の実装:

<__ __メイン。0x10d066878でテストインスタンス> 
__main __。テスト

インプリメンテーションの結果から明らかに見ることができる、自己現在のオブジェクトのアドレスのクラス、代表のインスタンスを表し、そして クラスに自己.__ class__ポイント

自己Pythonのキーワードではありません、我々はまたのrunoob通常の実行に彼を置くことができます。

クラステスト:DEF PRT(runoob):プリント(runoob)プリント(runoob .__ class__)T =試験()t.prt()

結果の上記の例の実装:

<__ __メイン。0x10d066878でテストインスタンス> 
__main __。テスト

オブジェクトのインスタンスを作成します。

同様のクラスの関数呼び出しのPythonの例

インスタンス化と__(自己、名前、給料)メソッドにクラス名の従業員を使用して以下のパラメータの__initを受けます。

"第1のオブジェクトクラス従業員作成" 
EMP1 =従業員( "ザラ"、2000年)
、 "第二の目的を作成するためにEmployeeクラスを" 
EMP2 =従業員( "MANNI"、5000)を

アクセスプロパティ

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '所有员工的基类'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
 
"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount
print "调用(实例.方法)emp1.displayCount():";emp1.displayCount()

次のように出力結果は上記のコードを実行します。

Name :  Zara , Salary:  2000
Name :  Manni , Salary:  5000
Total Employee 2
调用(实例.方法)emp1.displayCount():
Total Employee 2

同様の呼び出しでは、直接、追加、削除、クラスのプロパティを変更します。

emp1.age = 7  # 添加一个 'age' 属性
emp1.age = 8  # 修改 'age' 属性
del emp1.age  # 删除 'age' 属性

また、次の機能のプロパティの使用にアクセスできます。

  • GETATTR(OBJ、名[、デフォルト]):アクセス対象のプロパティ。
  • hasattr(OBJ、名):プロパティを確認してください。
  • SETATTR(OBJ、名前、値):設定してくださいプロパティ。プロパティが存在しない場合は、新しいプロパティを作成します。
  • delattr(OBJ、名):削除プロパティ。

hasattr(EMP1、 '年齢')# '年齢のプレゼンスプロパティが返すTrueの場合。GETATTR(EMP1、 '年齢')#戻り値の年齢 '属性値SETATTR(EMP1、 '時代'、8)#の追加属性の年齢は8' delattr(EMP1、 '年齢')#削除の属性の時代」であります


Pythonは組み込みのクラス属性

  • __dict__:クラス属性(辞書を含む、データクラス属性組成)
  • __doc__:クラスのドキュメンテーション文字列
  • __name__:クラス名
  • __module__:クラス定義モジュール(「__main __ className」のクラスの完全な名前である(一般__main__)、クラスモジュールMYMOD、その後、クラス名.__ module__等しいMYMODに導入されている場合)
  • __bases__:親クラスを構成するすべての要素(タプルは、親クラスのすべてが含まれています)

以下のように構築されたコールPythonのクラス属性の例は以下のとおりです。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '所有员工的基类'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
 
print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__

次のように出力結果は上記のコードを実行します。

従業員.__ doc__内の例題:所有员工的基类
従業員.__ name__:従業
員.__ module__:__main__ 
従業員.__ bases__:()
従業員.__ dict__に:{ '__module__': '__main__'、 'displayCount' <0x10a939c80で機能displayCount>、 ' empCount ':0、 'displayEmployee:__doc__'、<0x10a93caa0の機能displayEmployee> '':' \ XE6 \ x89 \ X80 \ XE6 \ x9c \ x89 \ xe5 \ X91 \ x98 \ xe5 \ xb7 \ xa5 \ XE7 \ x9a \ X84 \ xe5 \ x9f \ XBA \ XE7 \ XB1 \ XBB」、 '__init__':<0x10a939578での関数__init__>}

Pythonのオブジェクトが破壊される(ガベージコレクション)

参照カウント- 追跡とゴミ参照がすべてのアクティブなオブジェクトを持っているどのように多くのPython記録の内部。

内部トラッキング変数は、参照カウンタと呼ばれます。

オブジェクトが作成されると、それはオブジェクトがもはや必要とされている参照カウントを、(参照カウントが到達オブジェクトをゼロ)を作成し、それがガベージコレクションです。

しかし、回復は適切な時にインタプリタによって、「すぐに」ではない、ゴミオブジェクトが回復したメモリ領域を占有します

a = 40      # 创建对象  <40>
b = a       # 增加引用, <40> 的计数
c = [b]     # 增加引用.  <40> 的计数

del a       # 减少引用 <40> 的计数
b = 100     # 减少引用 <40> 的计数
c[0] = -1   # 减少引用 <40> 的计数

オブジェクト0の参照カウントのためのガベージコレクションのメカニズムだけでなく、同じ缶はまた、循環参照の場合を扱います。循環参照手段は、2つのオブジェクトが相互に参照することが、他の変数の参照それらはありません。この場合、唯一の参照カウントは十分ではありません。Pythonのガベージコレクタは、実際にはサイクルカウンタとガベージコレクタへの参照です。補助参照カウントガベージコレクタは、総量に注意を払うであろうようにラージオブジェクトを割り当て(参照によって破壊されたものはカウントしません)。この場合、インタプリタは、すべての参照されていないサイクルをクリーンアップしようとすると、一時停止します。

オブジェクトが使用されなくなったとき、オブジェクトが破棄されていない場合デストラクタ__del__、__ del__は(Pythonの2.X)を操作するdel__方法__、呼び出されます。

例(Pythonの2.X)

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "销毁"
 
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印对象的id
del pt1
del pt2
del pt3

以下のような結果の例です。

3083401324 3083401324 3083401324 
ポイントが破壊

クラスの継承

継承によってコードの再利用を達成するための一つの方法。

呼ばれる継承して新しいクラスを作成し、サブクラスまたは派生クラス

継承されたクラスが呼び出され、基本クラス親クラスまたはスーパークラス

継承の構文

クラスの派生クラス名(ベース・クラス名)
    ...

Pythonでいくつかの機能を継承します。

  • 1、サブクラスの親クラスのコンストラクタでは、必要に応じて
  • 2、この方法は、基本クラス、基本クラスを追加するには、クラス名の接頭辞の必要性、および自己パラメータ変数を持参する必要が呼び出されたとき。通常の関数呼び出しのカテゴリーことを除いて、自己のパラメータを持参する必要はありません。
  • 図3に示すように、Pythonは常にプロセス、サブクラスの対応する第一のタイプを見つける - >基底クラス

継承タプルの列に複数のクラスが、それは「と呼ばれている場合は多重継承。」

構文:

彼らの親クラスに似た派生クラスの宣言、クラス名と基底クラスのリストを継承した後、次のように:

class SubClassName (ParentClass1[, ParentClass2, ...]):
    ...

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Parent:        # 定义父类
   parentAttr = 100
   def __init__(self):
      print "调用父类构造函数"
 
   def parentMethod(self):
      print '调用父类方法'
 
   def setAttr(self, attr):
      Parent.parentAttr = attr
 
   def getAttr(self):
      print "父类属性 :", Parent.parentAttr
 
class Child(Parent): # 定义子类
   def __init__(self): #定义子类构造方法(相当于重写父类构造方法)
      print "调用子类构造方法"
 
   def childMethod(self):
      print '调用子类方法'
 
c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法 - 设置属性值
c.getAttr()          # 再次调用父类的方法 - 获取属性值

コードは次のように上記の結果は実行されます。

サブクラスのコンストラクタメソッドの呼び出し
コールサブクラスのメソッドには、
親クラスのメソッドを呼び出す
親クラスの属性を:200

あなたは複数のクラスを継承することができます

クラスA:#クラスA定義
..... 

クラスBの#は、クラスBを定義
..... 

クラスC(A、B)AとクラスB継承#
.....

あなたは検出するissubclass()またはでisinstance()メソッドを使用することができます。

  • issubclass() - クラスを決定するブール関数が別のクラスまたは下位クラスの構文のサブクラスである:issubclass(サブ、SUP)
  • でisinstance(OBJ、クラス)ブール関数OBJがオブジェクト・クラスのクラスのオブジェクトインスタンスのクラスまたはサブクラス戻る真のインスタンスである場合。

メソッドのオーバーライド(継承されたメソッド)

あなたの場合は、親クラスのメソッドの機能は、あなたのニーズを満たすことができない、あなたがすることができ、あなたのサブクラスで親クラスのメソッドをオーバーライドします

例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Parent:        # 定义父类
   def myMethod(self):
      print '调用父类方法'
 
class Child(Parent): # 定义子类
   def myMethod(self):  # 子类重写方法
      print '调用子类方法'
 
c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

次のように出力結果は上記のコードを実行します。

サブクラスのメソッドを呼び出します

基礎オーバーロードされたメソッド

次の表に、一般的なのいくつかは、あなたのクラスでオーバーライドすることができます:

いいえ。 単に呼び出す&を説明する方法、
1 __init__(自己[、引数...] )
コンストラクタは、
単にメソッドを呼び出す:  OBJ =クラス名(引数)
2 __del __(自己)
デストラクタ、オブジェクトの削除
、簡単なメソッド呼び出し:  デルOBJを
3 __repr __(自己)
形式に変換はのインタプリタによって読み取ら
:簡単なメソッド呼び出し  のrepr(OBJ)
4 __str __(自己)は
、両方の人間が読める形式に適した値に変換するために使用され
、単純な呼び出し方法を:  STR(OBJ)
5 __cmp__(自己、x)が
目標の比較的
単純なメソッド呼び出し:  CMP(OBJ、X-)

演算子のオーバーロード(既存事業者向け)

Pythonはまた、次のような例は、演算子のオーバーロードをサポートしています。

#!/usr/bin/python
 
class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b
 
   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

   def __sub__(self, other):
      return Vector(self.a - other.a, self.b - other.b)

   def __mul__(self, other):
      return Vector(self.a * other.a, self.b * other.b) 

v1 = Vector(2,10)
v2 = Vector(5,-2)

print v1 + v2
print v1 - v2
print v1 * v2

コードは次のように上記の結果は実行されます。

Vector(7,8)
Vector(-3,12)
Vector(10,-20)

シングル下線、二重下線、二重下線頭と尾の説明:

  • __foo__:特別なメソッドが定義されている、システム定義名概ね同様__init __()など。

  • _foo:単一下線付きで始まるがされた変数の種類を保護すなわち保護タイプのみが自身とサブクラスのアクセスにそれを許可することができモジュールのインポートから使用することはできません*

  • __foo:二重下線は、民間(プライベート)の変数の型を示すのみ(:自己.__ fooのクラス内でのアクセス方法)クラス自体へのアクセスを許可することができます。

クラス属性とメソッド

私有財産のクラス

__private_attrs2は、プロパティがプライベートであることを示す、アンダースコアで始まり使用またはクラスの外部から直接アクセスすることはできませんメソッドクラスの内部で使用する場合  の自己.__ private_attrs

クラスのメソッド

クラス内の使用  DEF  キーワードは、関数の一般的な定義は異なるクラスのメソッドとして定義することができるクラスメソッドは、パラメータ自己を含み、最初のパラメータとしてなければなりません。

def method(self[,arge1[,arge2···]])

クラスのプライベートメソッド

__private_method:2は、メソッドがプライベートメソッドとして宣言され、アンダースコアで始まり、外部コールは、クラスにすることはできません。クラス内のコール  の自己.__ private_methods

def self.__private_method(self[,arge1[,arge2···]])

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class JustCounter:
    __secretCount = 0  # 私有变量
    publicCount = 0    # 公开变量
 
    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print self.__secretCount
 
counter = JustCounter()
counter.count()
counter.count()
print counter.publicCount
print counter.__secretCount  # 报错,实例不能访问私有变量

クラスの名前が含まれるように名前を変更することでPythonの:

。1 
2 
2 
トレースバック(最新のラストコール):
  ファイル「test.py」、17行目、<Module1の>で。
    印刷エラーカウンタ.__ secretCount#、インスタンスがプライベート変数にアクセスすることはできません
はAttributeErrorを:JustCounterインスタンスが何の属性「持っていない __secretCount」を

Pythonは許可していませんインスタンス化クラス(インスタンスにアクセスプライベートデータに、しかし、あなたは使用することができます  object._className__attrName(  オブジェクト名クラス名__ ._プライベートプロパティ名を  次の例を参照してください、プロパティにアクセスするために):

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Runoob:
    __site = "www.runoob.com"

runoob = Runoob()
print runoob._Runoob__site

上記のコードは次のように実行結果は、実行されます。

www.runoob.com
公開された19元の記事 ウォンの賞賛0 ビュー805

おすすめ

転載: blog.csdn.net/weixin_44151772/article/details/104044387