Pythonの第7章 - オブジェクト指向

オブジェクト指向プログラミングの基礎

まず、オブジェクト指向の概念

プロセス指向とは何か1.1

それをオンにするための呼び出しで使用された場合、これらの手順を実装するための機能を使用し、その後、問題を解決するために必要な手順を分析ステップバイステップすることです。

例のライフ例。

1.2は、オブジェクト指向とは何ですか

オブジェクト指向トランザクションオブジェクトにダウン問題である、オブジェクトが問題解決の手順を通じて、完全なステップが、ミャオ族徐行動に事を確立することを意図していませんでした。

  1. それは思考のオブジェクト指向の方法であり、
  2. オブジェクト指向プログラミングは方法であり、
  3. 特定のためのオブジェクト指向プログラミング言語だけでなく、

1.3オブジェクト指向およびプロセス指向の違いとの接続

プロセス指向、何をすべきか

プロセス指向のプロセスは、ローカルまたは特定の、に焦点を当て、全体の問題を解決するための手順に焦点を当てたコア:実装プロセスを

[プロセス]について:
冷蔵庫に象のプットを置くために、あなたは3つのプロセスを必要としています。

  1. 冷蔵庫のドアは(冷蔵庫を得るために開いたドア)が開かれます
  2. ロードされたゾウ(象で満たされ、冷蔵庫の中に入る、ドアを開けます)
  3. 冷蔵庫のドア(象の後にインストールオープンドアは、ドアを閉め、冷蔵庫を取得する)
    プロセスの各段階のためのターゲットは、これらのプロセスを完了するために、象は冷蔵庫の中に置くことができるようになります、があります。

オブジェクト指向、行います

特定の機能のオブジェクト指向の焦点ので、オブジェクトはそのような機能を有すること。もっと全体に焦点を当てました。コア:オブジェクト

[オブジェクト指向]:
冷蔵庫に入れ象について、あなたは3つのアクション(またはと呼ばれる動作)を行う必要があります。
各アクションが演奏を持っている、それが対象です。

  1. 冷蔵庫は、あなたがドアを開けて私を与えます
  2. 象は、あなたが私の冷蔵庫のドリルに行きます
  3. 冷蔵庫は、あなたがドアを閉めするために私を与える
    これらのアクションを行うためには、象を冷蔵庫に入れることができるようになります。
各自的优缺点

面向过程的优点:
      流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;
      效率高,面向过程强调代码的短小精悍,善于结合数据结构来开发高效率的程序。。
      流程明确,具体步骤清楚,便于节点分析。

  缺点是:需要深入的思考,耗费精力,代码重用性低,扩展能力差,维护起来难度比较高,
          对复杂业务来说,面向过程的模块难度较高,耦合度也比较高。

面向对象的优点:结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思维方式;
    封装性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省; 
    容易扩展,代码重用率高,可继承,可覆盖;
    实现简单,可有效地减少程序的维护工作量,软件开发效率高。

  缺点是:效率低,面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非常少机会,
              从而不适合底层开发和游戏甚至多媒体开发;
              复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。

プログラミング言語の主流のオブジェクト指向達成するための2つの方法があります:オブジェクト指向とプロトタイプに基づくオブジェクト指向のクラスは。

達成するためにどのように関係なく、オブジェクト指向の三つの特徴があります。

  • パッケージ

    すなわち、このような抽象や具象オブジェクトとしてパッケージ客観的なものであり、クラスやオブジェクトは、データとメソッドは、信頼できない情報に隠れて、信頼できるクラスやオブジェクトの操作を可能に置くことができます。

  • 継承

    これは、オブジェクトが方法の別のタイプのオブジェクトの種類の特性を得ることを可能にします

  • ポリモーフィズム

    異なる形式の異なるインスタンス、異なる状況と同様。多型の異なる内部構造を有するオブジェクトが同じ外部インターフェイスを共有できるようにします。

1.4オブジェクト指向プログラミング言語の実装

1.4.1クラスベースのオブジェクト指向

典型的な言語:Javaの、C#、pthon、C ++など

生成するクラス(クラス)に依存するオブジェクト(物体)

1.4.2プロトタイプベースのオブジェクト指向

典型的な言語:JavaScriptの

オブジェクト(物体)から構成されているプロトタイプ(プロトタイプ)を使用してコンストラクタ(コンストラクタ)を頼ることです

二、Pythonのクラス

Pythonはオブジェクト指向の学習のpythonので、あなたが最初のクラスを学ばなければならない、オブジェクト指向のクラスベースの言語です

クラスとインスタンスの概念2.1

以前の研究によって、我々はすでにOOP(オブジェクト指向プログラミングと呼ばれるオブジェクト指向プログラミングを)知っている、それはプログラミングのアイデアです。OOPオブジェクトは、プログラムの基本単位として、オブジェクトが含まれている機能データ及び操作データ(法)

オブジェクトの集合の集まりのようなオブジェクト指向プログラミング及びコンピュータプログラム、及び各オブジェクトは、メッセージ送り、他のオブジェクトを受信することができ、これらのメッセージを処理するために、コンピュータプログラムを実行すると、オブジェクト間のメッセージパッシングの系列であります。


理解の2.1.1クラス

すべてのタイプのデータでPythonでは含めて、対象と見なすことができ、すべてのビルトインタイプの私たちは私たちの以前の研究を持っているintfloatというように。

これらのようにintfloatlistこれらのデータ型、私たちのオブジェクト指向クラス

私たちは多くの種類、これらのカスタムの種類に応じてカスタマイズすることができますし、私たちのオブジェクト指向のクラス


2.1.2は、オブジェクトを理解します

毎日、私たちは、オブジェクトを理解する方法を最後に、対象物を言うの?

a = 3変数のa割り当ては、整数3,3があるint。オブジェクトのタイプは
nums = [2, 4, 1]ここ[2, 4, 1]listオブジェクトの種類のリスト。

それは。Pythonでデータの任意の型がオブジェクトであるということができる(同じではないなど、他の言語のJava、C ++、彼らはオブジェクトではありません基本データ型のいくつかを持っています)

オブジェクトデータは、実際にカプセル化され、データの操作の方法が実行されます


オブジェクトと2.1.3クラス関係

クラスやオブジェクト間の関係は、私たちのそれぞれが人類に同じ関係です。

人間は娯楽、など手と足として、各特定の人の共通の特性を抽象化している耳を持っているだけでなく、食べることができ、男性はまた、偉大な健康に行くことができます。人間は言語の種類をプログラミングしています。

そして、誰もが自分の人間性の具体的な実現である。誰もがターゲットプログラミング言語です


クラスは、オブジェクトの抽象的な記述で、オブジェクトは、具体的な実装クラスです。彼らは、抽象と具象の関係です。


:例えば
自動車製造図面と一台の車。

描画オブジェクトクラスの車です


2.1.4第一、第一、オブジェクトまたはクラス

状況を見てください:

  1. オブジェクト指向分析を行うことで、一般的には、第一の目的は、抽象化の一般的なオブジェクトで、その後、クラスを形成します。
  2. コードを書くときには、一般的には、クラスの準備を完了し、それを必要なときに、その後のオブジェクトを作成することです。

2.2クラス定義

私たちは、キーワードを必要とするclassクラスを定義します

class 类名:
    # 类中定义的内容

たとえば、私たちは、学生の表現定義Studentのカテゴリを:

class Student:
    pass

説明:

  1. class クラス名が続きます。クラス名の名前がラクダの命名法を使用します。
  2. クラス名は、コロンの後ろに
  3. 正しいインデント。持つクラスの本体(上記の例で使用されるがpass、空のクラスの本体を示します)

オブジェクトの作成2.3

目的は、オブジェクトを作成するクラスを使用してクラスを定義することです。

Pythonのクラスでの使用は、他の言語とオブジェクト大きな違いを作成するために、他の言語キーワードを使用する必要がありnew、pythonの合理化の道を作成し、我々は必要ありませんnew

2.3.1 Pythonはオブジェクトを作成するために、フォーム内の関数を呼び出すことです!


Pythonはオブジェクトを直接作成する类名()ことに。

class Student:
    pass


s1 = Student()    # 使用类创建对象
print(s1)

オブジェクトの作成とメソッドの呼び出しは同じと同じではありません!

クラス定義の2.4深研究

クラスが定義され、使用されなければなりません

クラスや関数の定義の定義が同じで、我々は、再利用の最初の定義に従わなければなりません

s2 = Student()    # 此处无法使用类来创建对象


class Student:
    pass

ことが可能ifであっても定義されたクラス文を機能

if True:
    class Student:
        pass


s1 = Student()
print(s1)

授業時間の使用は、我々はクラスがすでに定義されていることを確認する必要があります。


クラスのボディ

クラス本体何を定義することができますか?

クラスはPythonで定義されることがあります。


(1フィールドfieldの属性と呼ばれる国内の多くの人々で)

Pythonの分野では二種類に分け:

  1. インスタンス変数(インスタンス変数):
    彼は保存された値は、彼らは私有財産の独立している人のようなすべてのオブジェクト、または異なるオブジェクトに属します。
  2. クラス変数(クラス変数):
    彼は格納されている値ではなくある特定のオブジェクトに属しているよりも、クラス自体に属している、または彼は公共の財産として、すべてのオブジェクトに共通されたという。

2.方法

私たちの以前の研究方法は、関数であるが、何とかそれに似て!

Pythonの3種類のメソッド:

  1. 方法の例
    と、インスタンス変数、彼はオブジェクトに属しているとして。
    インスタンスメソッドは通常の関数に比べて特別な場所があります:最初のパラメータは常に自動的にこのインスタンスに渡されます(オブジェクト)
  2. メソッドのクラス
    とクラス変数、クラスに属する。
    この方法の例は、最初の引数その区別クラスメソッド:最初のパラメータは常にクラスのクラスメソッドそのものです。
  3. 静的メソッド
    静的メソッドとインスタンスは、任意の関係を持っていません。それが唯一の唯一のクラスで定義され、クラスはこのメソッドの名前空間に相当し、この時間を。

2.4.1クラス定義のフィールド

2.4.1.1クラス変数

データ型の変数が、他の言葉で共通しているすべてのオブジェクトを表し、すべてのオブジェクトがへの直接アクセスを持ち、それらへのアクセスは、同じ変数(同じ値でなければなりません!)であります

変数は、クラス内の変数に直接宣言しました。

アクセスクラス変数に直接类名.变量名アクセスします。

class Student:
    # 直接在类中定义变量,
    # 这样的变量就是类变量(类属性, 类似 java 中的静态属性)
    country = "china"


print(Student.country)
# 修改类变量的值
Student.country = "usa"
print(Student.country)


あなたがすることによって任意の場所ですることができます。もちろん、类名.属性=值クラス属性に追加し、ダイナミッククラスの方法。

class Student:
    # 直接在类中定义变量,
    # 这样的变量就是类变量(类属性, 类似 java 中的静态属性)
    country = "china"


Student.count = 1   # 动态添加类属性
print(Student.count)

しかし、私たちはクラス属性を追加するための動的な方法で必要な場合にのみ使用され、クラスのプロパティのクラス定義に直接お勧めします。


2.4.1.2インスタンス変数

各オブジェクトのインスタンス変数は、ユニークな自分自身を表現します。

したがって、インスタンス変数は、それぞれ特定のオブジェクトに関連付けられています。

インスタンス変数を追加します。

一般的に知られているで__init__()これを追加する方法。(次のセクションと、その後方法についての詳細に入る、今はちょうど彼がそれに機能だ知っている必要があります)

__init__()、彼はそれぞれ2、約ていることに注意してください_。このメソッドは、オブジェクトを作成するためにクラスを使用すると、それは自動的にこのメソッドを呼び出します、手動でコールに私たちを必要としません。

この方法の最初のパラメータは常に作成されたオブジェクト(すべてのメソッドがこの例である)であり、我々はこのパラメータによってオブジェクトにプロパティを追加することができ、このプロパティは、インスタンスのプロパティです。

国際的な慣行として、通常は最初の1という名前のパラメータがありself、もちろん、あなたも彼に個人の名前を与えるが、なぜわざわざことができます!


class Student:
    def __init__(self):
        self.name = "李四"
        self.age = 20


s = Student()
print(s.name)
print(s.age)


上記の文言は、作成されたこのクラスを使用してオブジェクトの原因となりますnameし、age両者の値が良いではありません同じ値、このインスタンス変数を初期化します。

私たちは、各変数の初期値を使用すると、オブジェクトは自動的に過去に渡された特定の値伝え引数、実際の参加者を置くことで作成することができ、同じではありませんしたい__init__()2番目の引数はメソッドを開始します。

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age


zs = Student("张三", 20)
print(zs.name + " " + str(zs.age))
ls = Student("李四", 30)
print(ls.name + " " + str(ls.age))

あなたは、各オブジェクトの値が同じではないことがわかります!


2.4.1.3オブジェクト・クラス変数を介して直接アクセスすることができます

Pythonはオブジェクト変数を通じてクラスに直接アクセスすることができます。(いくつかの言語がC#など、許可されていない、JavaScriptが許可されるが、Javaを許可していません)

class Student:
    country = "china"

    def __init__(self, name, age):
        self.name = name
        self.age = age


zs = Student("张三", 20)
print(zs.name + " " + str(zs.age))
ls = Student("李四", 30)
print(ls.name + " " + str(ls.age))

print(zs.country) # 通过对象直接访问类变量
print(ls.country)


2.4.2メソッドは、クラスで定義されています

2.4.2.1。に規定された方法の例

一般的な方法と差分法の例:

  1. この方法の例は、クラスで定義しなければなりません
  2. 最初の引数は、常にインスタンスメソッドその特定のオブジェクトで、Pythonは自動的にそのオブジェクトを渡します、手動でパスに発信者を必要としません。そして、このパラメータは、一般的に命名されますself
  3. インスタンスメソッドの呼び出し:对象.实例方法(实参)

class Student:
    def __init__(self, name):
        self.name = name

    # 定义一个实例方法:一个参数表示具体的对象, python 会默认传入
    def speak(self):
        print("我的名字是:" + self.name)  # 在实例方法中访问实例变量


s = Student("志玲")
s.speak()


self理解

学んだ別の言語はPythonの自己は他の言語に実際にある、知っていますthis

だから、selfそのオブジェクトが最後に参照するには?

オブジェクトが呼び出されることによって、このインスタンス・メソッドは、次に例示的な方法は、self誰を参照します

そして、Python self生涯、結合度。(それとは異なりジャバスクリプトthisあなたが皮肉に目がくらむよう少し雌犬は、呼び出しとバインディングや件名を変更するためにさまざまな方法でヒット)


class Student:
    def __init__(self, name):
        self.name = name

    # 定义一个实例方法:一个参数表示具体的对象, python 会默认传入
    def speak(self):
        print("我的名字是:" + self.name)  # 在实例方法中访问实例变量


s = Student("志玲")
# s.speak 的 this 永远指定的是 s 对象
foo = s.speak  # 重新定义一个变量, 指向了对象 s 的 speak 方法. 
foo()  # 则 self 仍然绑定的是 s 对象


class Student:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("我的名字是:" + self.name)  # 在实例方法中访问实例变量


s1 = Student("志玲")
s2 = Student("凤姐")

s2.speak = s1.speak

s2.speak()

説明:
s1.speakその方法を表すために割り当てられているs2.speakあなたがそれを呼び出すときが、s2.speak()が、それは彼が監督の方法だself永遠に結合しましたs1


2.4.2.2。メソッド定義されたクラス

クラス及びインスタンスメソッドとの間の差:

  1. クラスメソッドになるための一つの方法として、組み込みのデコレータを追加するために、上記の方法の必要性:@classmethod
  2. 最初のパラメータは最初のパラメータは、クラスオブジェクトのクラスメソッドである、オブジェクトのメソッドの具体的な例である。(全部でPythonはオブジェクト、クラス自体ですまた、我々は一般的にクラスオブジェクトを呼び出し、オブジェクトされている)。Classオブジェクトがあります自動変速機のpython。(一般的に指定されたクラスオブジェクトcls
  3. メソッド呼び出しの例としては对象.实例方法(实参)、クラスのメソッドを呼び出します、类名.类方法(实参)
  4. 何もありませんので、クラスメソッドは、クラス変数、インスタンス変数にアクセスすることができますが、アクセスすることはできませんselfああ。

class Student:
    country = "china"

    @classmethod
    def say(cls):
        print("我们的国家是:" + cls.country)

Student.say()


クラスメソッドを使用するとき

インスタンス変数の方法が動作する必要がある場合は、このメソッドはクラスメソッドとして定義されることをお勧めします!


注意:

少し注意、クラスメソッドは、インスタンスオブジェクトを介して呼び出すことができますが、呼ばれるどんなには、最初のパラメータは常にクラスオブジェクトのクラスメソッドであります!

class Student:
    country = "china"

    @classmethod
    def say(cls):
        print("我们的国家是:" + cls.country)


Student.say()
s = Student()
s.say()


2.3.2.3。静的メソッドの定義

staticメソッドは、彼が唯一の名前空間のクラスであり、実際には通常の関数である。(彼の名前空間として現在のクラス、そうでない場合は通常の関数との違いはありません)。

  1. のみ上記の機能にデコレータを追加する必要があり、静的なメソッドを定義します。@staticmethod
  2. 静的メソッドを動員:类名.静态方法(实参)。ただ、任意の他の余分な操作をせずに通常の関数と比較して、彼の実行に接頭辞としてクラス名を取ります!

class Student:
    @staticmethod  # 定义静态方法
    def create_student():
        print("我是个静态方法")


Student.create_student()


アプリケーションシナリオの静的メソッド

唯一のPythonのクラスのため__init__()の方法が1つだけあるオブジェクトを作成することを意味する方法、。

オブジェクトを作成する他の方法を提供私たちは、外の世界への静的メソッドを使用することができます。


import time
class Date:
    """
    创建一个表示日期的类
    """
	def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    @staticmethod
    def now():
        """
        创建表示当前日期的对象
        :return:
        """
        t = time.localtime()
        return Date(t.tm_year, t.tm_mon, t.tm_mday)

    @staticmethod
    def tomorrow():
        """
        创建表示明日日期的对象
        :return:
        """
        t = time.localtime(time.time() + 60 * 60 * 24)
        return Date(t.tm_year, t.tm_mon, t.tm_mday)

now = Date.now()
print("现在是: %d年%d月%d日" % (now.year, now.month, now.day))
now = Date.tomorrow()
print("明天是: %d年%d月%d日" % (now.year, now.month, now.day))

で2.4.3のpython __init()__方法

任意のクラスでPythonは、そこにある__init__()方法、および1つだけです。

私たちは、自動的に実行に行きます、関係なく、どのような方法のオブジェクトを作成する__init__()方法

デフォルトでは、__init()__

デフォルトでは、__init()__何もしません。

__init__()インスタンス変数を初期化します

__init()__アクションのmainメソッドは、インスタンス変数を追加して初期化することである。渡された引数でオブジェクトを作成する際のインスタンス変数の初期値。

__init__()オブジェクトパラメータの最初のインスタンスは、常に新しく作成されました。

おすすめ

転載: www.cnblogs.com/yanadoude/p/12622887.html