ディレクトリ
オブジェクト指向プログラミング
コアオブジェクト指向プログラミング・ワードが対象である、オブジェクトは、機能とスキルの組み合わせです。
オブジェクト指向プログラミングはプログラミングの考えに基づいている、世界を作るようなものです、あなたはこの世界の神である、神は風に道を考えています。
長所:強力な拡張性
短所:プロセス指向プログラミングより複雑
クラスとオブジェクト
オブジェクトは、機能とスキルの組み合わせである、オブジェクトのクラスは、同様の機能のスキルの組み合わせのシリーズです。
現実の世界では、分類の概念の開発にのみ存在していた最初の具体的なオブジェクトは、Pythonプログラムは、クラスの概念がありますが、Pythonプログラムは、最初のクラスを定義して、オブジェクトを作成するためのクラスを呼び出す必要があります。
現実の世界では、クラスとオブジェクトを定義しています
カスタムオブジェクト
学生カテゴリ:
同様の特性:
学校 = '北京大学'
同様のスキル:
选课
プログラムで定義されたオブジェクトとクラス
クラスの定義
# 注意类中定义变量使用驼峰体
class BeijingStudent():
school = 'peking'
def choose_course(self):
print('is choosing course')
関数を定義する、構文のみを検出する機能は、コードが実行されません。しかし、クラスの定義は、クラス本体は、クラス自体が実際にコンテナ/名前空間は、名前を格納するために使用されていることを意味し、直ちにクラス定義フェーズでコードを実行すると、クラスの名前空間を生成し、これはアプリケーションの一つのクラス。
print(BeijingStudent.__dict__)
{'__module__': '__main__', 'school': 'peking', 'choose_course': <function BeijingStudent.choose_course at 0x000002A4E1AB5D08>, '__dict__': <attribute '__dict__' of 'BeijingStudent' objects>, '__weakref__': <attribute '__weakref__' of 'BeijingStudent' objects>, '__doc__': None}
print(BeijingStudent.__dict__['school'])
peking
print(BeijingStudent.__dict__['choose_course'])
<function BeijingStudent.choose_course at 0x000002A4E1AB5D08>
try:
BeijingStudent.__dict__['choose_course']()
except Exception as e:
print('error:', e)
error: choose_course() missing 1 required positional argument: 'self'
print(BeijingStudent.school)
peking
BeijingStudent.choose_course(111)
is choosing course
print(BeijingStudent.choose_course)
<function BeijingStudent.choose_course at 0x000002A4E1AB5E18>
BeijingStudent.__dict__['choose_course']
<function __main__.BeijingStudent.choose_course(self)>
BeijingStudent.country = 'China'
BeijingStudent.__dict__['country']
'China'
BeijingStudent.country = 'CHINA'
BeijingStudent.__dict__['country']
'CHINA'
del BeijingStudent.school
print(BeijingStudent.__dict__)
{'__module__': '__main__', 'choose_course': <function BeijingStudent.choose_course at 0x000002A4E1AB5E18>, '__dict__': <attribute '__dict__' of 'BeijingStudent' objects>, '__weakref__': <attribute '__weakref__' of 'BeijingStudent' objects>, '__doc__': None, 'country': 'CHINA'}
カスタムオブジェクト
オブジェクトを生成するクラスを呼び出すことができ、手順は、クラス/インスタンスの結果として知られているクラスのインスタンス、オブジェクトがインスタンス化されるとしても知られる、クラスを呼び出します。
stu1 = BeijingStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
print(stu1.country)
CHINA
stu2 = BeijingStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
print(stu2.country)
CHINA
stu3 = BeijingStudent() # 调用类会得到一个返回值,该返回值就是类的一个具体存在的对象/实例
stu3.choose_course()
is choosing course
ユニークなカスタムオブジェクトを備え
関数がクラスが使用できるクラス属性クラスで定義された関数であるが、使用は、それの正常な機能である、それは少数を渡すためにいくつかの値を渡す関数パラメータのルールを完全に遵守する必要性を意味します。
導入
class BeijingStudent:
school = 'peking'
def choose_course(self):
print('is choosing course')
stu1 = BeijingStudent()
stu2 = BeijingStudent()
stu3 = BeijingStudent()
クラス属性が変更された場合は、学生の上記クラスの場合、他のオブジェクトのプロパティが変更されます。
print(stu1.school)
BeijingStudent.school = 'PEKING'
peking
print(stu1.school)
PEKING
ユニークなカスタムオブジェクトを備え
print(stu1.__dict__)
{}
print(stu2.__dict__)
{}
クラスに似た自然のオブジェクトだけでなく、名前空間が、オブジェクト・スペースの名前は、オブジェクト固有の名前を保存すると、クラスオブジェクトは、共通名に格納されています。したがって、我々は直接だけでカスタム名をターゲットにすることができます。
stu1.name = 'tom'
stu1.age = 18
stu1.gender = 'male'
print(stu1.name, stu1.age, stu1.gender)
tom 18 male
try:
print(stu2.name, stu2.age, stu2.gender)
except Exception as e:
print(e)
'BeijingStudent' object has no attribute 'name'
stu2.name = 'jerry'
stu2.age = 18
stu2.gender = 'female'
print(stu2.name, stu2.age, stu2.gender)
jerry 18 female
カスタム属性クラスの定義フェーズ
def init(obj, x, y, z):
obj.name = x
obj.age = y
obj.gender = z
init(stu1, 'tom1', 19, 'male1')
print(stu1.name, stu1.age, stu1.gender)
tom1 19 male1
init(stu2, 'jerry1', 29, 'female1')
print(stu2.name, stu2.age, stu2.gender)
jerry1 29 female1
上記の方法を使用すると、私たちは単純な特性を調整、それでもあまりにも面倒することができますが、オブジェクトがインスタンス化されるときのタイミング特性を自動的にトリガすることができるならば、それはより便利なので、クラスが使用できる__init__
方法を。
class BeijingStudent:
school = 'peking'
def __init__(self, name, age, gender):
'''调用类时自动触发'''
self.name = name
self.age = age
self.gender = gender
print('*'*20)
def choose_course(self):
print('is choosing course')
try:
stu1 = BeijingStudent()
except Exception as e:
print(e)
__init__() missing 3 required positional arguments: 'name', 'age', and 'gender'
stu1 = BeijingStudent('tom', 18, 'male')
********************
- 上記の現象によって見つけることができたときに、呼び出し元のクラス二つのことを発生します。
- 空のオブジェクトを作成します。
- 自動的にクラスの引き金と
__init__
執行機能を、着信クラスブラケット付きSTU1コール内のパラメータ
print(stu1.__dict__)
{'name': 'tom', 'age': 18, 'gender': 'male'}
オブジェクトのシーケンスのプロパティを探します
プロパティを探します
- 独自の名前空間を見つけるために、オブジェクトを開始し、その後、見つけるために、クラスに行っていない場合は、クラスでもエラー
class BeijingStudent:
school = 'peking'
count = 0
aa = 10
def __init__(self, x, y, z): # 会在调用类时自动触发
self.name = x
self.age = y
self.gender = z
BeijingStudent.count += 1
self.aa = 1
def choose_course(self):
print('is choosing course')
print(BeijingStudent.count)
0
stu1 = BeijingStudent('tom', 18, 'male')
print(stu1.count)
1
stu2 = BeijingStudent('jerry', 19, 'male')
print(stu2.count)
2
stu3 = BeijingStudent('shane', 25, 'male')
print(stu3.count)
3
print(BeijingStudent.count)
3
- クラスのプロパティの上記変形するので、クラス属性カウント3は他の実施例のカウントが3であり、修飾されています
print(stu1.count)
print(stu2.count)
print(stu3.count)
3
3
3
- aaは私有財産であるので、彼らはプライベートSTUのAAを使用しますので、AAクラスを使用しません
print(stu1.__dict__)
print(stu2.__dict__)
print(stu3.__dict__)
{'name': 'tom', 'age': 18, 'gender': 'male', 'aa': 1}
{'name': 'jerry', 'age': 19, 'gender': 'male', 'aa': 1}
{'name': 'shane', 'age': 25, 'gender': 'male', 'aa': 1}
結合方法のクラスとオブジェクト
結合方法のクラスとオブジェクト
class BeijingStudent:
school = 'peking'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def choose_course(self):
print(f'{self.name} is choosing course')
def func(self):
print('from func')
クラスデータ属性および機能属性が持つすべての共有オブジェクトの名前空間で定義されています
データのみのオブジェクトの名前空間で定義された属性、およびオブジェクトデータの属性に固有のものです
バインドされたオブジェクトのクラス
stu1 = BeijingStudent('tom', 18, 'male')
stu2 = BeijingStudent('jerry', 19, 'male')
stu3 = BeijingStudent('shane', 25, 'male')
print(stu1.name)
print(stu1.school)
tom
peking
- 関数がクラスが使用できるクラス属性クラスで定義された関数であるが、使用は、それの正常な機能である、それはいくつかの値を渡すためにいくつかの値を渡す関数パラメータのルールを完全に遵守する必要性を意味します。
print(BeijingStudent.choose_course)
<function BeijingStudent.choose_course at 0x000002A4E1C01268>
try:
BeijingStudent.choose_course(123)
except Exception as e:
print(e)
'int' object has no attribute 'name'
バウンドメソッドオブジェクト
- クラス定義関数は、すべてのオブジェクトに共有され、オブジェクトが使用されてもよい、とを有する被験体に結合しています
- 結合効果:自動的に最初の引数として渡されます誰が呼ぶ人、彼らは呼び出す必要があります誰が、誰にバインド
print(id(stu1.choose_course))
print(id(stu2.choose_course))
print(id(stu3.choose_course))
print(id(BeijingStudent.choose_course))
2907183244104
2907183244104
2907183244104
2907185353320
print(id(stu1.school))
print(id(stu2.school))
print(id(stu3.school))
2907185318128
2907185318128
2907185318128
print(id(stu1.name), id(stu2.name), id(stu3.name))
2907185317792 2907185319192 2907185317568
stu1.choose_course()
stu2.choose_course()
stu3.choose_course()
tom is choosing course
jerry is choosing course
shane is choosing course
- クラス定義された関数は、クラスが実際に使用することができますが、実際には多くの場合、クラス定義の機能は、標的に結合するために使用されているので、このクラスで定義された関数は、パラメータ自己を所有する必要がありますが追加されました
stu1.func()
from func
BeijingStudent.func(1)
from func
クラスとデータ型
クラスとデータ型
- クラスとタイプののpython3統一コンセプトは、クラスの型であります
class Foo:
pass
obj = Foo()
print(type(obj))
<class '__main__.Foo'>
lis = [1, 2, 3]
lis2 = [4, 5, 6]
print(type(lis))
<class 'list'>
- LISとlis2は、オブジェクト、メソッド、およびLIS APPEND独立しlis2をインスタンス化しています
lis.append(7)
print(lis)
[1, 2, 3, 7]
print(lis2)
[4, 5, 6]
list.append()メソッド原理
class BeijingStudent:
school = 'peking'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def choose_course(self, name):
print(f'{name} is choosing course')
stu1 = BeijingStudent('tom', 18, 'male')
stu1.choose_course(1) # BeijingStudent.choose_course(stu1,1)
1 is choosing course
BeijingStudent.choose_course(stu1, 1)
1 is choosing course
lis = [1, 2, 3]
print(type(lis))
<class 'list'>
lis.append(4)
print(lis)
[1, 2, 3, 4]
list.append(lis, 5)
print(lis)
[1, 2, 3, 4, 5]
高度に統合されたオブジェクト
いいえオブジェクトません
- オブジェクト思考に直面し、私達はちょうどメソッドを使用したくない場合には、データベースに接続するには、たとえば、あなたはそれをしなければなりません
import pymysql # 连接mysql的三方库,可以pip3 install pymysql安装
def exc1(host, port, db, charset, sql):
conn = pymysql.connect(host, port, db, charset)
conn.execute(sql)
return xxx
def exc2(proc_name):
conn = pymysql.connect(host, port, db, charsett)
conn.call_proc(sql)
return xxx
exc1('1.1.1.1', 3306, 'db1', 'utf-8', 'select * from t1')
exc1('1.1.1.1', 3306, 'db1', 'utf-8', 'select * from t2')
exc1('1.1.1.1', 3306, 'db1', 'utf-8', 'select * from t3')
exc1('1.1.1.1', 3306, 'db1', 'utf-8', 'select * from t4')
- 文字セットが固定されていてもよいホスト、ポート、DBとして、SQLが変更されたので、我々は、上記の方法により異なるSQL文を実行する、非常に面倒なので、私たちは、デフォルトパラメータを使用することができます
def exc1(sql, host='1.1.1.1', port=3306, db='db1', charset='utf-8'):
conn = pymysql.connect(host, port, db, charset)
conn.execute(sql)
return xxx
exc1('select * from t1')
exc1('select * from t2')
exc1('select * from t3')
exc1('select * from t4')
- デフォルトのパラメータは操作を単純化するために使用されていますが、異なるオブジェクトに対して、参照パラメータは静的ではないか、我々は非常に面倒であるEXC2方法を修正する必要があり、オブジェクト指向の使用を考慮することが可能です
オブジェクトがあります。
- オブジェクトの後では、上記の例のために、私たちはこれを行うことができます
import pymysql
class Foo:
def __init__(self, host, port, db, charset):
self.host = host
self.port = port
self.db = db
self.chartset = chartset
def exc1(self, sql):
conn = pymysql.connect(self.host, self.port, self.db, self.charset)
conn.execute(sql)
return xxx
def exc2(self, proc_name):
conn = pymysql.connect(self.host, self.port, self.db, self.charsett)
conn.call_proc(sql)
return xxx
obj1 = Foo('1.1.1.1', 3306, 'db1', 'utf-8')
obj1.exc1('select * from t1')
obj1.exc1('select * from t2')
obj1.exc1('select * from t3')
obj1.exc1('select * from t4')
obj2 = Foo('1.1.1.2', 3306, 'db1', 'utf-8')
obj2.exc1('select * from t4')
- 上記の現象が発生するため、我々は、オブジェクトが実際に高度に統合された製品、データとデータの操作の特別な方法の統合であると結論付けることができる(結合方法)