オブジェクト指向プログラミングの基礎
プログラマは「オブジェクト指向プログラミング」を聞いたことがあるはずです瞬間に住んでいる、彼は何を「オブジェクト指向プログラミング、」我々は、より正式な声明を見てみましょうを説明するために、次の文を使用することができれば、多くの場合、誰かが尋ねました。
「被験体を処理するためのデータ構造および方法のセット(オブジェクト)、クラス(クラス)に分類同じ挙動を持つオブジェクト、(カプセル化)カプセル化クラスによって内部の詳細を非表示にするには、(継承)継承によって特殊化クラスを達成多型(多型)を割り当てることにより、動的オブジェクト・タイプに基づいて(専門)と一般化(一般化)。 "
だから、それは良く理解していません。よりユーザーフレンドリー、ほとんど知っているから、コンテンツの以下の部分を言うために見て、私たちはそう。
説明:ネットワークから上記の内容は、著者の見解や意見を表すものではありません、と著者自身Lichangwuguan、責任を負いません助け著者は想定しています。
我々が言った前に「プログラムは、命令のセットで、」我々は、実行されるプログラム文で記述し、その後CPUによって実行される1つのまたは複数の命令に変わります。もちろん、設計プロセスを簡素化するために、我々は、機能に依存しないと、多くの場合、再利用するコードを関数の概念を導入し、これらの機能を使用する必要性は、単純に呼び出す機能することができる、機能が複雑すぎると面倒な関数の場合、我々は、システムの複雑さを軽減するために、さらにサブ機能に分割機能を継続することができます。私たちは、いわゆるプログラミングが完了さまざまなタスクに制御コンピュータに合わせて作業コンピュータープログラマーの方法であることを発見した場合のことを言って、しかし、私は知りません。プログラムは、コンピュータに応えるために思考の正常なヒトの道を放棄しなければならない場合は、思考が正常なヒトとコンピュータは、どう違うのか、たくさんの楽しい以下、「誰もがプログラミングを学ぶ必要があり、」そのようなレトリック私たちはそれについて話すことができます。もちろん、彼らは、コードを開発し、維持する作業の複雑さは、その1960年代後半には、「ソフトウェアの危機」困難となり、我々は複雑なシステムを開発する必要がある場合、最も重要なことは、最も重要ではありません、コンセプト「ソフトウェア工学」のシリーズは、業界に表示されるようになりました。
もちろん、プログラマのサークルの人々はそれを知って、実際に、それは、これらの質問にSmalltalkのプログラミング言語が導入された前世紀の70年代の誕生を見たいと思って、実際のソフトウェア開発者を上記の「銀の弾丸」を解決していませんオブジェクト指向プログラミングのアイデア(オブジェクト指向プログラミングは、Simulaの言語の以前のプロトタイプに背をたどることができます)。プログラミングのこの概念によると、関数型プログラミングデータと運用データは、私たちが「オブジェクト」と呼ぶ、と我々は問題を解決する方法は、ニーズを幅広く発行するオブジェクトやオブジェクトを作成することである、論理的な全体でありますニュース、複数のオブジェクトの共同作業は、最終的に私たちは、現実世界の問題を解決するための複雑なシステムを構築することができます。
説明:もちろんそうではないオブジェクト指向ソフトウェア開発のは、今日のハイレベルなプログラミング言語は、ほぼすべての複数のプログラミングパラダイムをサポートしていますので、最後の「銀の弾丸」のすべての問題を解決することで、Pythonは例外ではありません。
クラスとオブジェクトは、
単にクラスは青写真とテンプレートオブジェクトであり、オブジェクトは、クラスのインスタンスである、置きます。この説明は、ソート概念の解釈の概念のようなのだったが、少なくとも、我々はこの文から見ることができますが、クラスが抽象的概念であるが、オブジェクトは、特定の事です。オブジェクト指向プログラミングの世界では、すべてのものは、オブジェクトは、オブジェクトには属性があり、各オブジェクトの挙動は一意であり、オブジェクトが特定のカテゴリ(タイプ)に属している必要があり、です。我々は静特性(プロパティ)を入れオブジェクトと抽出された動特性(行動)の一般的な機能をたくさん持っているときは、名前の「クラス」の事を定義することができます。
定義されたクラスは、
次のようにオブジェクトの動的特徴は、コードを記述することができるように、Pythonでクラスクラスキーワードを定義し、以前に定義されたクラスのメソッド関数によって研究することができます。
class Student(object):
# __init__是一个特殊方法用于在创建对象时进行初始化操作
# 通过这个方法我们可以为学生对象绑定name和age两个属性
def __init__(self, name, age):
self.name = name
self.age = age
def study(self, course_name):
print('%s正在学习%s.' % (self.name, course_name))
# PEP 8要求标识符的名字用全小写多个单词用下划线连接
# 但是部分程序员和公司更倾向于使用驼峰命名法(驼峰标识)
def watch_movie(self):
if self.age < 18:
print('%s只能观看《熊出没》.' % self.name)
else:
print('%s正在观看岛国爱情大电影.' % self.name)
説明:書き込み機能はクラスで、我々は通常の方法(オブジェクト)を呼び出し、これらのメソッドの目的は、メッセージを受信することができるということです。
作成および使用はオブジェクト
我々は良いクラスを定義するとき、あなたは次のようにオブジェクトを作成し、オブジェクトにメッセージを与えることができます。
def main():
# 创建学生对象并指定姓名和年龄
stu1 = Student('骆昊', 38)
# 给对象发study消息
stu1.study('Python程序设计')
# 给对象发watch_av消息
stu1.watch_movie()
stu2 = Student('王大锤', 15)
stu2.study('思想品德')
stu2.watch_movie()
if __name__ == '__main__':
main()
アクセス可視性の問題
上記のコード、C ++、Javaのための、C#や他のプログラミング経験のプログラマは、どのようなアクセスの種類(また、視認性と呼ばれる)最後にプロパティを持っている名前と年齢にバインドされた学生対象に私たちを求めることができます。多くのオブジェクト指向プログラミング言語では、我々は通常、ターゲットプロパティはプライベートに設定されていますので、オブジェクトのメソッドは、通常は公開されながら、簡単に言えば、(保護)(プライベート)または保護されたが(、外の世界にアクセスを許可されていませんパブリック)、開示された方法は、オブジェクトがメッセージを受け入れることであるからです。あなたはプロパティが始まる2つのアンダースコアとして使用する名前で私有財産である場合は、次のコードは、これを確認することができ、パブリックとプライベートでのPythonでは、アクセスプロパティとメソッドの2つだけの、。
class Test:
def __init__(self, foo):
self.__foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
# AttributeError: 'Test' object has no attribute '__bar'
test.__bar()
# AttributeError: 'Test' object has no attribute '__foo'
print(test.__foo)
if __name__ == "__main__":
main()
しかし、Pythonは文法から厳格なプライバシーのプライベートプロパティまたはメソッドを保証するものではありません、それだけのプライベートプロパティとそれらに妨げるのアクセスに名前の変更の方法を与えるあなたはルールがまだへのアクセス権を持って知っていれば、実際には、名前を変更します彼らは、次のコードは、これを確認することができます。この設定の理由は、「我々は、すべてここに同意成人している」という有名な格言、によって説明することができます。ほとんどのプログラマは、自分の行動に責任をより良いクローズドよりオープンし、プログラマと思いますので。
class Test:
def __init__(self, foo):
self.__foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
test._Test__bar()
print(test._Test__foo)
if __name__ == "__main__":
main()
それはサブクラスにつながるため、実際の開発では、我々は、アクセスが(後述する)ことができない、プライベートにプロパティをお勧めしません。だから、ほとんどのPythonプログラマは、命名規則に従います単一の属性名はプロパティを表現するためにアンダースコアで始まるようにすることです慎重なままにしてくださいプロパティへの訪問中に、クラスのこのコードの外側を保護されています。それらの年 - この慣行は、文法規則は、より頻繁に、それは比喩であるか黙示ので、単一のアンダースコアが外の世界のプロパティとメソッドは、まだアクセス可能で、この時点で私は、」Pythonのを見ることができますされていません我々は、これらのピット「を説明する記事を踏ん。
オブジェクト指向のストラット
オブジェクト指向の三つの柱:カプセル化、継承、多型。次の章では後者の二つの概念詳細な説明は、ここではパッケージであるかについての話をしましょう。パッケージの私自身の理解では、「(提供)のみ、外の世界への簡単なプログラミングインタフェースを露出し、すべての隠された非表示の実装の詳細」です。我々は、オブジェクトを作成した後、単にオブジェクトを与えるためには、メッセージを送信し、実際に私たちは、クラスアップで定義された方法でカプセル化されたデータ上のデータや操作、(メソッドを呼び出す)コードの方法を実行することができ、その我々あなただけが方法(メソッドの内部ビュー)の内部実装の詳細を知らなくても、名前と、着信メソッドのパラメータ(外部ビュー方式)を知っておく必要があります。
演習1:デジタル時計を説明するクラスを定義します。
from time import sleep
class Clock(object):
"""数字时钟"""
def __init__(self, hour=0, minute=0, second=0):
"""初始化方法
:param hour: 时
:param minute: 分
:param second: 秒
"""
self._hour = hour
self._minute = minute
self._second = second
def run(self):
"""走字"""
self._second += 1
if self._second == 60:
self._second = 0
self._minute += 1
if self._minute == 60:
self._minute = 0
self._hour += 1
if self._hour == 24:
self._hour = 0
def show(self):
"""显示时间"""
return '%02d:%02d:%02d' % \
(self._hour, self._minute, self._second)
def main():
clock = Clock(23, 59, 58)
while True:
print(clock.show())
sleep(1)
clock.run()
if __name__ == '__main__':
main()
面内のクラスメソッド定義された点について説明し、点距離にモバイルコンピューティングポイントを提供する:2つの演習。
from math import sqrt
class Point(object):
def __init__(self, x=0, y=0):
"""初始化方法
:param x: 横坐标
:param y: 纵坐标
"""
self.x = x
self.y = y
def move_to(self, x, y):
"""移动到指定位置
:param x: 新的横坐标
"param y: 新的纵坐标
"""
self.x = x
self.y = y
def move_by(self, dx, dy):
"""移动指定的增量
:param dx: 横坐标的增量
"param dy: 纵坐标的增量
"""
self.x += dx
self.y += dy
def distance_to(self, other):
"""计算与另一个点的距离
:param other: 另一个点
"""
dx = self.x - other.x
dy = self.y - other.y
return sqrt(dx ** 2 + dy ** 2)
def __str__(self):
return '(%s, %s)' % (str(self.x), str(self.y))
def main():
p1 = Point(3, 5)
p2 = Point()
print(p1)
print(p2)
p2.move_by(-1, 2)
print(p2)
print(p1.distance_to(p2))
if __name__ == '__main__':
main()