【パイソン(X)のオブジェクト指向プログラミング

1.オブジェクト指向プリアンブル

設計の初めからPythonはすでにオブジェクト指向言語であり、そのように、Pythonでクラスとオブジェクトを作成するのは簡単です。

そして、最初のオブジェクト指向の下のいくつかの基本的な機能の簡単な理解を取ります。

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

クラスを作成します。2.

クラスを作成します

クラスは、クラス名で、コロン、以下の例で終了した後、新しいクラスを作成するには、クラスステートメントを使用します。

class ClassName:
   '类的帮助信息'   #类文档字符串
   class_suite  #类体

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

クラスのメンバ、メソッド、データ属性をclass_suite。

クラスのインスタンスを作成します。

以下は、単純な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
  • empCount変数は変数であり、その値は、このクラスのすべてのインスタンス間で共有されます。あなたは、クラスや外部クラスの内部使用のEmployee.empCountにアクセスすることができます。
  • 第一の方法の__init __()メソッドは、特別なメソッド、コンストラクタ、またはクラスのインスタンスメソッドを作成するために呼び出されたときに、クラス初期化メソッドが呼び出されています
  • クラス、自己定義されたクラスに代わって自己の例として呼び出すときに必ずしも適切なパラメータが渡されたものの、方法は、いくつかでなければなりません。

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

通常の関数からクラス唯一の特定の差のメソッド - 彼らは、としてその名が自己であるが通例である、余分な最初のパラメータ名を持っている必要があります。

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
t = Test()
t.prt()

結果の上記の例の実装:

<__main__.Test instance at 0x10d066878>
__main__.Test

明確な実装の結果から分かるように、自己現在のオブジェクトのアドレスを表すクラスのインスタンスを表し、クラスself.classにポイント。

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

クラスのインスタンスを作成するには、クラスの名前を使用し、__init__メソッドのパラメータで受け入れ可能。

"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)

アクセスプロパティ

あなたは、ドットを使用することができます(。)オブジェクトのプロパティにアクセスするには。次のようにクラスの名前を持つアクセスクラス変数:

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

完全な例

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

出力:

Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
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, 'age')    # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age')    # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(empl, 'age')    # 删除属性 'age'

ビルトインクラスの属性

  • 辞書:クラス属性(辞書を含む、データクラス属性組成)
  • DOC:クラスのドキュメンテーション文字列
  • 名前:クラス名
  • モジュール1:クラスモジュールの定義は(クラスのフルネーム「はメインクラスモジュールMYMOD、その後、クラス名に導入された場合、.className」モジュール1等しいMYMOD)
  • 拠点:親クラスを構成する全ての要素(タプルで親クラスのすべてが含まれています)

例としては、次のとおりです:

#coding=utf-8
#!/usr/bin/python

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__

出力:

Employee.__doc__: 所有员工的基类
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x10a939578>}

3.継承されたクラス

継承

オブジェクト指向プログラミングがもたらすの主な利点の一つは、これを達成するためにコードの再利用を再利用することで、一つの方法は、継承機構を介してです。継承は完全にクラスにタイプおよびサブタイプ間の関係を理解することができます。

警告:継承構文クラスの派生クラス名(ベースクラス名):// ...基底クラスが指定されたタプルで、クラス定義であるとき、括弧内の基底クラス名を書きます。

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

  • 1:下記構造で(のチェンZhongjiクラスのinit()メソッド)が自動的に呼び出されていない、その派生クラスの構築に呼び出すために特別な人を取ります。
  • 2:メソッドは、基本クラス、基本クラスを追加するには、クラス名の接頭辞の必要性、および自己パラメータ変数を持参する必要が呼ばれます。あなたは、クラスの通常の関数呼び出しとは別の自己パラメータを持参する必要はありません
  • 3:Pythonは常に最初にそれが派生クラスで見つけることができない場合、このメソッドに対応する、方法の対応するタイプを見つけ、それが基底クラスに一つ一つを見て始めました。(このクラスのfindメソッドの呼び出しまず、基本クラスが探しに行く前に見つけることができません)。

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

構文:

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

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

例としては、次のとおりです:

#coding=utf-8
#!/usr/bin/python

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 '调用子类方法 child method'

c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法
c.getAttr()          # 再次调用父类的方法

出力:

调用子类构造方法
调用子类方法 child method
调用父类方法
父类属性 : 200

複数のクラスを継承することができる次のように、例を示します。

class A:        # 定义类 A
.....

class B:         # 定义类 B
.....

class C(A, B):   # 继承类 A 和 B
.....

それは、使用issubclass()または検出するためでisinstance()メソッドであってもよいです。

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

メソッドのオーバーライド

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

例としては、次のとおりです:

#coding=utf-8
#!/usr/bin/python

class Parent:        # 定义父类
   def myMethod(self):
      print '调用父类方法'

class Child(Parent): # 定义子类
   def myMethod(self):
      print '调用子类方法'

c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法

出力:

调用子类方法

メソッドのオーバーロード

いくつかの一般的な機能は、自分のクラスでオーバーロードでき、次の表に示します:

いいえ。 単に呼び出す&を説明する方法、
1 INITシンプルに(セルフ[、引数...])コンストラクタメソッドの呼び出し:OBJ =クラス名(引数)
2 デル(自己)オブジェクトを削除するための簡単な方法にデストラクタメソッド呼び出し:デルOBJ
3 repr(セルフ):通訳のための簡単なフォームには、readメソッドを呼び出しますの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)

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

出力:

Vector(7,8)

4.クラスの属性とメソッド

  • クラスのプライベートプロパティ:__private_attrs:2は、プロパティがプライベートであり、クラスや外部への直接アクセスに使用できないという、アンダースコア(_)で始まります。メソッドクラスの内部で使用する場合の自己.__ private_attrs

  • メソッドのクラス:クラス内で、defキーワードは、クラスのメソッドとして定義され、一般的に異なる関数定義することができるが、この方法はクラスパラメータ自己を含み、最初のパラメータとして必要があります

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

例としては、次のとおりです:

#coding=utf-8
#!/usr/bin/python
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  # 报错,实例不能访问私有变量

出力:

1
2
2
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    print counter.__secretCount  # 报错,实例不能访问私有变量
AttributeError: JustCounter instance has no attribute '__secretCount'

Pythonはアクセスプライベートデータに許可され、インスタンス化していますが、使用することができますobject._className__attrNameの、アクセス属性をコード次のコード上記のコードの最後の行を置き換えます。

.........................
print counter._JustCounter__secretCount

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

1
2
2
2

シングル下線、二重下線、二重下線ヘッドとテールの説明

  • FOO:特別なメソッドが定義され、一般的に類似したシステム定義の名前INITなど()と。
  • _foo:単一下線付きで始まるが、すなわち保護タイプは、自身とサブクラスのアクセスにそれをのみを許可することができ、変数の型を保護し、モジュールのインポートから使用することはできません*
  • __foo:二重下線は、民間(プライベート)の変数の型が唯一のクラス自体を訪問させることができるを示しています。
公開された246元の記事 ウォンの賞賛121 ・は 10000 +を見て

おすすめ

転載: blog.csdn.net/BeiisBei/article/details/104044003