ディレクトリ
Pythonの研究ノート--Day04
四日目、燃料、オブジェクト指向のスタートを続けます
カテゴリ
あなたが保存されたデータオブジェクトの一部を通過するか、適切な行動を呼び出すことができるように、以前にクラスで学んだ関数で定義されたクラスとメソッドを定義して、オブジェクトを作成するために、classキーワードを使用しました。サンプルコードではまず見て
class Person(object):
def __init__(self, name, age, father):
self.name = name
self.age = age
self.__father = father
def __speak_father(self):
print("my father is", self.__father)
def speak(self):
print("I'm a person, and my name is %s, and I'm %d years old" % (self.name, self.age))
def main():
person1 = Person("zhangsan", 12, "zhanger")
person2 = Person("lisi", 13, "lisan")
person1.speak()
person2.speak()
# person2.__speak_father()
# 访问私有方法
person2._Person__speak_father()
if __name__ == "__main__":
main()
このコードでは、__ init__メソッドは、オブジェクトを作成するときに、このメソッドはプライベートメソッドであるspeak_father、初期化動作が__、行われ、Javaのコンストラクタに相当し、規定は我々が直接オブジェクトを介してこのメソッドを呼び出したいということではありません、しかし、実際に話す、メソッドが呼び出しに保護された方法で、これだけのクラスのオブジェクトまたはサブクラスのオブジェクトである_私たちは途中でmainメソッドを呼び出す必要があり、それはルールを破る、アンダースコアで始まる、このような操作はお勧めしません。この方法は、Personオブジェクトは、このメソッドを呼び出して行くことができる限り、一般的な方法です。
オブジェクト指向の基礎
オブジェクト(オブジェクト指向、OO)は、ソフトウェア指向開発方法論であるパッケージ、継承、多態性およびその他の設計方法でオブジェクト指向プログラミングを使用することを指し、これら三つのオブジェクト指向開発は、三つの特徴の中で最も重要であり、私たちは一つ一つを見て私たちはこれらのオブジェクトを使用するときに、私たちの関係は、コードのみオープンインタフェース、実装の詳細を知る必要はありませんされ、そして、ちょうどパブリックアクセスの提供外のパッケージ、隠されたオブジェクトのプロパティと実装の詳細、どのようなものですカプセル化され、結合をある程度低減することができ、コードの再利用性を向上させます。継承は、クラスとクラス間の関係で、すでに新しいプロパティやメソッドを拡張することができ、この新しいクラスに基づいて新しいクラスを定義するための基礎として存在するクラス定義は、あなたが定義された親クラスを使用することができます機能。ポリモーフィックは、サブクラスのオブジェクトに親クラスの参照であるつまるところ、この文は、Javaは、多くの場合、参照変数のメソッド呼び出しが発行されたポイントの種類、最終的にはオブジェクトのインスタンス変数への参照であること、それはどういう意味、と述べていますどのプログラムが実行される前に、実装クラスメソッドを決定しなければなりません。私はこの部分が感動参照するには、Javaを知ったとき、あなたも見ていることが推奨されているため、オブジェクト指向については、私は、、、特定が行くと導入の内側の「Javaでの思考」を参照してくださいすることができ、具体的に金額は記載されています最も感銘を受け、この本を読んですることは、自分自身でそれを探求することを意味し、具体的何を、フレーズ、「すべてがオブジェクトである」だけでなく、それに意味の哲学的なポイントです。
@propertyデコレータ
上記の例が示す性質の人、2つのパブリックとプライベート1は、我々はすべての後に、お勧めしませんという2つの方法がありますが、直接外の世界にさらされたオブジェクトのプロパティが問題であり、私たちはこれらの属性が保護に設定されている、それはアンダースコアを追加することで、前述されています_
。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:@property包装器包装getter和setter方法
class Person(object):
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@property
def age(self):
return self._age
@age.setter
def age(self, age):
self._age = age
@name.setter
def name(self, name):
self._name = name
def speak(self):
print("I'm a person, and my name is %s, and I'm %d years old" % (self._name, self._age))
def main():
person = Person('zhangsan', 12)
person.speak()
person.age = 11
person.name = 'lisi'
person.speak()
print(person.age)
if __name__ == "__main__":
main()
このサブパラグラフのタイトルは、それはgetterメソッドを提供するために、アクセスデバイスが何であるか、この手段であり、コードは@name.setter
これらの二つのアクセサが何をして、我々はまだ対応する属性値を変更する必要があるため、セッターメソッドを提供するために使用しました修正およびアクセス。直接通じ对象名.属性名
、我々はそれを行うことができる方法。
__slots__使用
バインドされていただけに導入Pythonは、動的言語である私たちは、プログラムで標的に結合することができ、新たなプロパティやメソッドが実行されているされて、あなたはまた、プロパティとメソッドのアンバンドリングすることができません。そして__slots__
限定することをオブジェクトのプロパティを結合することができる、オブジェクトクラスは、タプルの属性を制限するためにバインドすることができます。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:slots的使用
class Person(object):
__slots__ = ('_name', '_age', '_gender')
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@property
def age(self):
return self._age
@name.setter
def name(self, name):
self._name = name
@age.setter
def age(self, age):
self._age = age
def speak(self):
print("I'm a person, and my name is %s, and I'm %d years old" % (self.name, self.age))
def main():
person = Person('zhangsan', 12)
person._gender = '男'
print(person.name)
print(person._gender)
person._nana = "nana"
print(person._nana)
if __name__ == "__main__":
main()
あなたはそれを実行した後、コンソール情報を見ることができますこのコードは場所に落ちました。
静的メソッドとクラスメソッド
静的メソッドは、クラスメソッドと静的メソッドと同様の方法、CLSと呼ばれる最初のパラメータ規則を呼び出すために、クラス名から直接あなたができることです、それは我々がこのパラメータとそれに関連するクラスを介して取得することができ、関連する情報オブジェクトの現在のクラスを表します情報およびクラスのうち、オブジェクトを作成することができます。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:静态方法和类方法
class AddUtil(object):
@staticmethod
def add(*num):
total = 0
for item in num:
total += item
print(total)
@classmethod
def add_num(cls):
return cls.add(1, 1, 1)
def main():
AddUtil.add(1, 1, 1, 1, 1, 1)
AddUtil.add_num()
if __name__ == "__main__":
main()
書き換え方法
サブクラスは親クラスが書き換えることにより、既存の親クラスを書き換えることがあり、我々は別のサブクラスは異なる挙動を示すために、同じインターフェイスは上記多型言及されて呼び出すことができます継承します。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:方法的重写
from abc import abstractmethod, ABCMeta
class Person(object, metaclass=ABCMeta):
"""人类"""
@abstractmethod
def speak(self, name):
pass
class Student(Person):
"""学生类"""
def speak(self, name):
print("%s是本学生的名字" % name)
class Worker(Person):
"""工人类"""
def speak(self, name):
print("%s是本工人的名字" % name)
def main():
student = Student()
student.speak("zhangsan")
worker = Worker()
worker.speak("lisi")
if __name__ == "__main__":
main()
他のクラスがこのクラスを継承し、適切な機能を実装できるようにすることです、あなたがすることができますので、Personクラスは抽象クラスである、抽象クラスは、クラスのオブジェクトを作成することはありませんが、Personクラスは抽象メソッドを定義してあるabc
ブロックABCMeta
メタクラスをそして、abstractmethod
抽象クラスを達成するためのラッパーは、上記の方法を話すコードPersonクラスは抽象メソッドで、それによって、Personクラスのオブジェクトを作成することはできません。
ファイル
データ永続操作実際の開発は、最も直接的な方法は、ファイルに保存されます。ライトのみのpythonファイル組み込みのopen関数、非常に簡単です、あなたは、このようなエンコードされたファイルの情報オブジェクトへのアクセスとして、動作モードを、ファイル名を指定することができますファイルを操作することができ、その後、あなただけのファイルに書き込むことができます。(表パイソンチュートリアルファイルと100日の羅ハオ例外)以下で動作モードテーブル。
動作モード | 特定の意味 |
---|---|
'r' |
読み取り(デフォルト) |
'w' |
書き込み(以前の内容は、最初のカットオフされます) |
'x' |
ファイルが既に存在する場合に例外を生成し、書きます |
'a' |
追加は、既存のファイルの末尾に内容を書き込みます |
'b' |
バイナリモード |
't' |
テキストモード(デフォルト) |
'+' |
アップデート(両方が読み書きできます) |
テキストファイルの読み取りおよび書き込みは、一つのファイル名を使用して良いオープン機能、及び第2の動作モードと、上記の3つの指定されたパスは、第三の符号化され、パスは、相対または絶対パスとすることができる場合に、動作モードがデフォルトでありr
、一致するように符号化パラメータを指定してファイルのエンコーディングをコードする、それ以外の場合は、障害を読ん原因となります。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:文件读取小例子
def main():
file = open('README.txt', 'r', encoding='utf-8')
print(file.read())
file.close()
if __name__ == "__main__":
main()
異常な
上記のコードのようなファイルが存在しないため、可能性があるか、コーディング矛盾しては異常な状態は、プログラムがクラッシュした後、開くことができません。我々のコードの改善フォールトトレランスと堅牢性を提供するために、Pythonの例外メカニズムはそう。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:文件读取
def main():
file = None
try:
file = open('README.txt', 'r', encoding='utf-8')
print(file.read())
except FileNotFoundError:
print("无法打开该文件")
except LookupError:
print('指定了未知的编码!')
except UnicodeDecodeError:
print('读取文件时解码错误!')
finally:
file.close()
if __name__ == "__main__":
main()
私たちは、おそらくバックでのtryコードブロックで実行されているエラーコードは、最後のクローズ開いているファイルに最後に使用され、発生したリソースを解放し、最終的には関係なく、通常の手順のブロックもキャッチ例外しようとする以外の数を続けることができますすることができますまたは異常は、いわゆる、実行される最も適切なリソースを解放するための操作として使用される「常にコードブロックの実行」。キーワードを指定することにより、リソースのコンテキストを持つファイルとは、オブジェクトコンテキストを離れるときにも、ファイルが自動的に解除されたコンテキストの構文を使用することができます。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:with
def main():
try:
with open('README.txt', 'r', encoding='utf-8') as file:
print(file.read())
except FileNotFoundError:
print("无法打开该文件")
except LookupError:
print('指定了未知的编码!')
except UnicodeDecodeError:
print('读取文件时解码错误!')
if __name__ == "__main__":
main()
ファイルオブジェクトは、コンテナ、次のコードに行にファイルのリストを読み込むことができますreadlinesを、持っています。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:with
def main():
try:
with open('README.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
print(lines[0])
except FileNotFoundError:
print("无法打开该文件")
except LookupError:
print('指定了未知的编码!')
except UnicodeDecodeError:
print('读取文件时解码错误!')
if __name__ == "__main__":
main()
私のファイルは一行だけですので、私は唯一のインデックス0があるため、中で横断行くことができます。
小さなケースファイルコピー
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:
def main():
try:
with open('123.png', 'rb') as file1:
data = file1.read()
print(data)
with open('copy_123.png', 'wb') as file2:
file2.write(data)
except FileNotFoundError as e:
print('指定的文件无法打开.')
except IOError as e:
print('读写文件时出现错误.')
print('程序执行结束.')
if __name__ == "__main__":
main()
JSONを読みます
さて、異種システム間でのデータ交換にJSON形式としてJSONは公式ウェブサイトを参照することができ、JSONについての知識は非常に人気があります。
{
"name": "zhangshan",
"age": 12,
"books": [
{"name": "book1", "price": 12},
{"name": "book2", "price": 14}
]
}
そして、それの辞書、およびPythonの対応は次の通りです。
JSON | パイソン |
---|---|
オブジェクト | 辞書 |
アレイ | リスト |
ストリング | STR |
番号(int型/リアル) | int型/フロート |
真/偽 | 真/偽 |
ヌル | なし |
パイソン | JSON |
---|---|
辞書 | オブジェクト |
リスト、タプル | アレイ |
STR | ストリング |
int型、float型、INT-&フロート由来列挙型 | 数 |
真/偽 | 真/偽 |
なし | ヌル |
以下でPythonのJSONモジュール。
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:json的使用
import json
def main():
someone = {
"name": "zhangshan",
"age": 12,
"books": [
{"name": "book1", "price": 12},
{"name": "book2", "price": 14}
]
}
try:
with open("data.json", 'w', encoding='utf-8') as file1:
json.dump(someone, file1)
except IOError as e:
print(e)
print("数据保存完成!")
if __name__ == "__main__":
main()
4つの主要な機能でJSONモジュール:
dump
- PythonのJSON形式は、ファイルに応じてオブジェクトをシリアル化dumps
- JSON形式にPython文字列オブジェクト処理load
- JSONデータファイルは、オブジェクトにデシリアライズloads
- 文字列の内容は、オブジェクトのPythonにデシリアライズ
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:json
import json
def main():
temp_dict = {'name': 'zhangsan', 'age': 12, 'role': 'student'}
json_str = json.dumps(temp_dict)
print(json_str)
# 因为文件存在所以就没有进行try-except
file = open('data.json', 'r')
temp_dict1 = json.load(file)
print(temp_dict1['name'])
file.close()
if __name__ == "__main__":
main()
エピローグ
四日も懸命に仕事を続け、多くのことを見ました!
エラーがある場合、私の記事を見つけるか、何かいいアイデアは、私に連絡することができている場合は、私たちが一緒に進行一緒に勉強し、私のメールアドレスは[email protected]です
のは、これらの複数の操作を行いましょう!