1.三つの特徴
パッケージ
多くで⼀にデータオブジェクトカプセル化する。機能コードは、あなたが書くとして考えカプセル化された特定の状況、特定の分析に属するモジュールにパッケージパッケージ⼀コードブロック、関数、オブジェクト、に固定されて⼀ Bは、これはまた、内⾯被写体思想に包装さそのように呼ぶことができる。非常に⽜関数である。⽆一見より重要である⼀。これは、パッケージ何および使用を格納⼀⼀するシステムからのコンテンツの組み合わせであります。
受け継ぎます
事⼀の明確な理解に与えられた⼀、サブメニューのクラスが自動的にホワイトは言った。私有財産に加えて、他のすべてのコンテンツと同様に⽗持つことができ、サブメニューは、簡単に使用東⻄父親に子供の手の届かないことができます。しかし、私の友人。あなたは父を持っている必要があります、子供のサブメニューの到達後。順序は混沌とすることはできません、Pythonで実装の継承は非常に簡単です。文のクラスでは、⾯クラス名の後の括弧のために1時間を追加し、あなたが相続を完了することができます。それを継承使って何をアクセスすることができますか?単純な2つのクラスがコード⾯層。⽗抽出⼀クラスを2つのクラスの同じ部分によって調製クラスを⽗継承フォームを使用して記録することができる。2つの観点から同じ機能または機能を有する場合クラスこのクラスを継承し、その上に撮影された。これの利点が書かれている、我々は機能の重複の多くを回避し、コードを書くことができます。あなたは例意味解析から行く場合。コンテキストは、種は、x yを浮上⼀であればはるかに簡単になります。この場合には、yは⼀概念の一般化の一種である。X、Y、より具体的なより。それは、このような猫のように、サブメニューのY種類xを、その後では、アクティブな動物、動物を継承し⼀動物猫です。猫でも活躍しています。この猫で動物の作成に「ダイナミック」を持っています このプロパティは。別の例として、白い細かい骨が⼀モンスターである。と呼ばれるモンスターの日⽣が⼀比較的貧しい機能「食べるためにフェイス、」白い細かい骨がする方法を知っている⽣うち⼀「顔を食べる。」この時点で白い骨細かい継承モンスター。
ポリモーフィズム
私たちはただ、具体的。例えば、我々は変数a = 10、我々はこのことを知っている⼀作成しないでください。ストレートで使用し⼀ので⼀オブジェクト、様々な形態を持つ。実際には、Pythonでこれは、白い説明するのは容易ではありません整数型ですが、私たちは、プログラムA =「アレックス」を作ることができたときに、この時、文字列型への個別の保証が。これは、我々はすべて知っているものです。私はこれが多型である。ことを教えましょう抵抗。⼀同じ変数は、種々の形態であってもよいです
2.アヒル
良い、あなたはアヒルのように見えるのことわざではPythonは、あなたはアヒルです。
class A:
def f1(self):
print('in A f1')
def f2(self):
print('in A f2')
class B:
def f1(self):
print('in A f1')
def f2(self):
print('in A f2')
obj = A()
obj.f1()
obj.f2()
obj2 = B()
obj2.f1()
obj2.f2()
AとBの2つのクラスが全く結合がないが、意味では、それらは統一規格です。
これらの2つの方法の開発を容易に同じ名前で設定された同じ関数が、相互ダックタイピングになることができます。
例としては、たくさん:STRタプルのリストが標準を統一することで、インデックス方式を有しています。
strのバイト、などこれは、クロスアヒル型と呼ばれます。
3.制約クラス
制約の2つのクラスがあります。
最初:例外がスローされます
その後、抽出⽗クラスとは⽗クラスで救済を定義した。この救済で乾燥して何もして。⼀それに例外をスローする。このようなクラスは、それ以外の救済をオーバーライドする必要がありますすべてのサブメニューを。訪問の時はエラーになります。
class Payment:
def pay(self,money):
raise Exception("子类设置pay方法")
class QQpay(Payment):
def pay(self,money):
print(f"QQ支付{money}金额")
class Alipay(Payment):
def pay(self,money):
print(f"支付宝支付{money}金额")
class Wechatpay(Payment):
def zhifu(self,money):
print(f"微信支付{money}金额")
def pay(obj,money):
obj.pay(money)
obj1 = QQpay()
pay(obj1,100)
obj2 = Alipay()
pay(obj2,200)
obj3 = Wechatpay()
pay(obj3,300)
"""
QQ支付100金额
Traceback (most recent call last):
支付宝支付200金额
File "D:/pycharm demo/练习/代码练习.py", line 30, in <module>
pay(obj3,300)
File "D:/pycharm demo/练习/代码练习.py", line 20, in pay
obj.pay(money)
File "D:/pycharm demo/练习/代码练习.py", line 3, in pay
raise Exception("子类设置pay方法")
Exception: 子类设置pay方法
"""
第二:メタクラス
メタクラスがで⼀抽象的救済が与えられているメタクラス⽗クラスを説明し使用します。このようなクラスは、サブメニューがカメラのための抽象メソッドの特定の実装を与えるだろう。制約にも効果を果たしている可能性があります。
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self,money):
pass
class QQpay(Payment):
def pay(self,money):
print(f"QQ支付{money}金额")
class Alipay(Payment):
def pay(self,money):
print(f"支付宝支付{money}金额")
class Wechatpay(Payment):
def zhifu(self,money):
print(f"微信支付{money}金额")
def pay(obj,money):
obj.pay(money)
obj1 = QQpay()
pay(obj1,100)
obj2 = Alipay()
pay(obj2,200)
obj3 = Wechatpay()
pay(obj3,300)
"""
QQ支付100金额
Traceback (most recent call last):
支付宝支付200金额
File "D:/pycharm demo/练习/代码练习.py", line 63, in <module>
obj3 = Wechatpay()
TypeError: Can't instantiate abstract class Wechatpay with abstract methods pay
"""
4.super深さ分析
class A:
def f1(self):
print('in A f1')
def f2(self):
print('in A f2')
class Foo(A):
def f1(self):
super().f2()
print('in A Foo')
obj = Foo()
obj.f1()
"""
'in A f2'
'in A Foo'
"""
super可以下一个类的其他方法
class A:
def f1(self):
print('in A')
class Foo(A):
def f1(self):
super().f1()
print('in Foo')
class Bar(A):
def f1(self):
print('in Bar')
class Info(Foo,Bar):
def f1(self):
super().f1()
print('in Info f1')
obj = Info()
obj.f1()
'''
in Bar
in Foo
in Info f1
'''
print(Info.mro()) # [<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>]
super()严格按照类的mro顺序执行
class A:
def f1(self):
print('in A')
class Foo(A):
def f1(self):
super().f1()
print('in Foo')
class Bar(A):
def f1(self):
print('in Bar')
class Info(Foo,Bar):
def f1(self):
super(Foo,self).f1()
print('in Info f1')
obj = Info()
obj.f1()
"""
in Bar
in Info f1
"""