インタフェースクラスと抽象クラス
15042 ワード
インタフェースクラスと抽象クラス(いずれも思想概念)
一、インタフェースクラスと抽象クラスとは何かを簡単に説明する
Javaは主にオブジェクト向けにプログラミングされており、設計モデルを推奨しているが、インタフェースは設計モデルの中の思考概念であるため、インタフェースクラスはJavaの中で原生的にサポートされているが、pythonの中で原生的にインタフェースクラスをサポートしていないが、設計モードにはインタフェースクラスという概念があり、pythonも設計モードの思考を使うため、インタフェースクラスにも触れる.
インタフェースクラス:pythonオリジナルはサポートされていません
抽象クラス:pythonオリジナルサポート
二、コードの中でインタフェースクラスを実現する
いくつかの支払い方法を定義し、最後に支払い入口を統一します.コードは以下の通りです.
実行結果:
上記の実行結果から分かるように、定義された第3の支払い方式は、支払い入口を統一することで支払いができなくなり、結果が間違って報告され、エラーの報告方式を変更します.以下のコードです.
実行結果:
コードから分かるように、支払い方法にpayの関数方法が存在しない限り、親paymentのpay方法を直接実行し、後で自分の書いたエラーを直接報告することで、エラーの支払い方法に存在するべきであることを示すことができます.
親クラスのpayメソッドと同じメソッドまたは関数ですが、このようなエラーメソッドはpayメソッドを呼び出すことによってエラーを特定する必要があります.payメソッドを呼び出さない場合、エラーの場所を見つけることができます.このようなコードは、次のように改善されます.
実行結果:
これにより,インタフェースクラスをコードで実現する大まかな構造を引き出すことができ,類似の構造は以下のようになる.
インタフェースクラスと抽象クラスは、サブクラスを制約する規範的なサブクラスとして機能します.異なる点は、次のとおりです.
インタフェースクラス:マルチ継承をサポートし、インタフェースクラスのすべての方法を実現できない必要があります.そうすれば、規範的な役割を果たすことができます.Javaでは
抽象クラス:マルチ継承はサポートされていません.抽象クラスの方法にはいくつかのコードの実装があります.Javaでは
一、インタフェースクラスと抽象クラスとは何かを簡単に説明する
Javaは主にオブジェクト向けにプログラミングされており、設計モデルを推奨しているが、インタフェースは設計モデルの中の思考概念であるため、インタフェースクラスはJavaの中で原生的にサポートされているが、pythonの中で原生的にインタフェースクラスをサポートしていないが、設計モードにはインタフェースクラスという概念があり、pythonも設計モードの思考を使うため、インタフェースクラスにも触れる.
インタフェースクラス:pythonオリジナルはサポートされていません
抽象クラス:pythonオリジナルサポート
二、コードの中でインタフェースクラスを実現する
いくつかの支払い方法を定義し、最後に支払い入口を統一します.コードは以下の通りです.
class Wechatpay:
def pay(self,money):
print(' %s ' % money)
class Alipay:
def pay(self,money):
print(' %s ' % money)
# Applepay
class Aapplepay:
def fuqian(self,money): # pay
print(' %s ' % money)
def pay(pay_obj,money):
# , ,
pay_obj.pay(money)
wechat = Wechatpay()
#
ali = Alipay()
#
app = Aapplepay()
#
pay(wechat,100) # 100
pay(ali,200) # 200
pay(app,300) # pay , Applepay pay fuqian,
実行結果:
C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-1/PycharmProjects/untitled/ / .py
100
200
Traceback (most recent call last):
File " ", line 26, in
File " ", line 16, in pay
AttributeError: 'Aapplepay' object has no attribute 'pay'
上記の実行結果から分かるように、定義された第3の支払い方式は、支払い入口を統一することで支払いができなくなり、結果が間違って報告され、エラーの報告方式を変更します.以下のコードです.
#
class Payment:
def pay(self,money):
raise NotImplementedError # , pay
class Wechatpay(Payment): # Payment , pay , ,
def pay(self,money):
print(' %s ' % money)
class Alipay(Payment):
def pay(self,money): # Payment , pay , ,
print(' %s ' % money)
# Applepay
class Aapplepay(Payment):
# Payment , pay , , , pay ,
# , ’NotImplementedError‘
def fuqian(self,money): # pay
print(' %s ' % money)
def pay(pay_obj,money):
# , ,
pay_obj.pay(money)
wechat = Wechatpay()
#
ali = Alipay()
#
app = Aapplepay()
#
pay(wechat,100) # 100
pay(ali,200) # 200
pay(app,300) # pay , Applepay pay fuqian,
実行結果:
100
Traceback (most recent call last):
200
File " ", line 33, in
File " ", line 23, in pay
File " ", line 4, in pay
NotImplementedError
コードから分かるように、支払い方法にpayの関数方法が存在しない限り、親paymentのpay方法を直接実行し、後で自分の書いたエラーを直接報告することで、エラーの支払い方法に存在するべきであることを示すことができます.
親クラスのpayメソッドと同じメソッドまたは関数ですが、このようなエラーメソッドはpayメソッドを呼び出すことによってエラーを特定する必要があります.payメソッドを呼び出さない場合、エラーの場所を見つけることができます.このようなコードは、次のように改善されます.
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta): # type
@abstractmethod
def pay(self,money):
pass
# , , pay ,
# , ,
class Wechatpay(Payment): # Payment , pay , ,
def pay(self,money):
print(' %s ' % money)
class Alipay(Payment):
def pay(self,money): # Payment , pay , ,
print(' %s ' % money)
# Applepay
class Aapplepay(Payment):
# Payment , pay , , , pay ,
# , ’NotImplementedError‘
def fuqian(self,money): # pay
print(' %s ' % money)
def pay(pay_obj,money):
# , ,
pay_obj.pay(money)
wechat = Wechatpay()
#
ali = Alipay()
#
app = Aapplepay()
#
# , pay , ,
#
# pay(wechat,100) # 100
# pay(ali,200) # 200
# pay(app,300) # pay , Applepay pay fuqian,
実行結果:
Traceback (most recent call last):
File " ", line 32, in
TypeError: Can't instantiate abstract class Aapplepay with abstract methods pay
これにより,インタフェースクラスをコードで実現する大まかな構造を引き出すことができ,類似の構造は以下のようになる.
from abc import abstractmethod,ABCMeta
class Payment(metaclass=ABCMeta): # type
@abstractmethod
def pay(self,money): # pay
pass
class A(Payment):
def pay(self,money):pass
class B(Payment):
def pay(self,money):pass
class C(Payment):
def pay(self,money):pass
インタフェースクラスと抽象クラスは、サブクラスを制約する規範的なサブクラスとして機能します.異なる点は、次のとおりです.
インタフェースクラス:マルチ継承をサポートし、インタフェースクラスのすべての方法を実現できない必要があります.そうすれば、規範的な役割を果たすことができます.Javaでは
抽象クラス:マルチ継承はサポートされていません.抽象クラスの方法にはいくつかのコードの実装があります.Javaでは