1. Python のハイパーパラメータ
Python では、スーパーは別のクラスのメソッドを呼び出します。クラスが別のクラスを継承する場合、そのクラスは親クラス、基本クラス、またはスーパークラスと呼ばれます。
super の使用は、親クラスに直接アクセスしてそのメソッドを呼び出すため、非常に簡単です。
引数は super に渡すことができます。クラスとクラス インスタンスの 2 つのパラメータを取ります。
サンプルコード:
class A:
def roo(self):
return 'roo() from A'
class B(A):
def roo(self):
print('roo() from B')
return super().roo()
class C(A):
def roo(self):
print('roo() from C')
return super().roo()
class D(B, C):
def roo(self):
print('roo() from D')
return super(C, self).roo()
a=A()
b=B()
c=C()
d=D()
print(a.roo())
print(b.roo())
print(c.roo())
print(d.roo())
出力:
roo() from A
roo() from B
roo() from A
roo() from C
roo() from A
roo() from D
roo() from A
2. スーパーは継承の概念を使用します
オブジェクト指向プログラミングの概念に慣れていない場合、継承は馴染みのないものに思えるかもしれません。オブジェクト指向プログラミングでは、継承とは、プロパティと動作を再度実装することなく、別のクラスから派生 (または継承) できるクラスの機能を指します。
これらの概念を理解する便利な方法は、コードの一部を確認することです。そのため、いくつかの形状を説明するためにいくつかのクラスを作成してみましょう。
サンプルコード:
class Rectangle_Shape:
def __init__(self, len, wid):
self.length = len
self.width = wid
def area(self):
return self.length * self.width
def perimeters(self):
return 2 * self.length + 2 * self.width
class Square_Shape:
def __init__(self, len):
self.length = len
def area(self):
return self.length * self.length
def perimeters(self):
return 4 * self.length
s=Square_Shape(4)
print(s.area())
r=Rectangle_Shape(3,5)
print(r.area())
このクラスには、Rectangle_Shape と Square_Shape という 2 つの対応するクラスがあります。
出力:
16
15
この例では、相互に関連する 2 つの形状を示します。 正方形は長方形の一種です。コードにはこの関係が反映されていないため、本質的にコードが重複することになります。
継承を使用すると、実際の長方形と正方形の関係を反映しながら、記述するコードの量を減らすことができます。
サンプルコード:
class Rectangle_Shape:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
def perimeters(self):
return 2 * self.length + 2 * self.width
# Making the Square_Shape class that initiates the Rectangle_Shape class
class Square_Shape(Rectangle_Shape):
def __init__(self, len):
super().__init__(len, len)
s=Square_Shape(4)
print(s.area())
この場合、super() は Rectangle_Shape クラスの init() を呼び出します。これはコードを書き直すことなく Square_Shape クラスで使用されます。
出力:
16
例に示すように、Rectangle_Shape は親クラスであり、Square_Shape は子クラスです。
Python でのハイパーパラメータの正確な使用
以下は、M、N、および O クラスのコードです。
class M:
def __init__(self):
print("M initiated successfully")
class N(M):
def __init__(self):
super().__init__()
print("N initiated successfully")
class O(N):
def __init__(self):
super(O, self).__init__()
print("O initiated successfully")
o=O()
上記のコードが想定しているように、すべてのクラスは直接の親の init() メソッドをオーバーライドします。super() は属性を必要としないため、引数なしで使用するだけで十分です。
出力:
M initiated successfully
N initiated successfully
O initiated successfully
クラス M2 に N の init() メソッドをスキップさせ、代わりに M の init() メソッドを実行させたいとします。init() メソッドは、クラスの直接の親が N であっても、N ではなく M を継承する必要があります。
こちらはクラスM2です。実際に見てみましょう。
class M:
def __init__(self):
print("M initiated successfully")
class N(M):
def __init__(self):
super().__init__()
print("N initiated successfully")
class O(N):
def __init__(self):
super(O, self).__init__()
print("O initiated successfully")
class M2(N):
def __init__(self):
super(N, self).__init__()
print("other O initiated successfully")
m2=M2()
上記のコードから推測できるように、今回は正しいスーパークラスを選択するために属性を super() メソッドに渡しました。m2 = M2() を実行した結果、次の出力が得られます。
M initiated successfully
other O initiated successfully
直接のスーパークラス __init__() メソッドを呼び出す代わりに、M'sinit() Python メソッドを呼び出します。
これらのステートメントまたは演算子 (super()[name] など) を使用した暗黙的な検索の場合、super() は未定義です。
また、super() は、引数なしの形式以外の内部メソッドの使用に制限されません。引数が 2 つある形式を使用して、引数を正確に特定し、適切に引用します。
クラス定義では、コンパイラがクラスとインスタンスを取得するために必要な詳細を入力するため、引数がゼロの場合のみ機能します。
Python で Super を使用してパラメーターをコンストラクターの多重継承に渡す
通常、さまざまな継承を扱う場合は、基本クラスを多重継承用に設計する必要があります。
場合によっては、2 つのクラスに類似したパラメーター名が付いていることがあります。これが発生すると、**kwargs や *args からキーと値のペアを削除できなくなります。
オブジェクトとは異なり、パラメーターを吸収/無視できる Base クラスを定義することができます。
サンプルコード:
class Base(object):
def __init__(self, *args, **kwargs): pass
class P(Base):
def __init__(self, *args, **kwargs):
print("P")
super(P, self).__init__(*args, **kwargs)
class Q(Base):
def __init__(self, *args, **kwargs):
print("Q")
super(Q, self).__init__(*args, **kwargs)
class R(P):
def __init__(self, arg, *args, **kwargs):
print("R","arguments=",arg)
super(R, self).__init__(arg, *args, **kwargs)
class S(Q):
def __init__(self, arg, *args, **kwargs):
print("S", "arguments=",arg)
super(S, self).__init__(arg, *args, **kwargs)
#Python小白学习交流群:153708845
class T(R,S):
def __init__(self, arg, *args, **kwargs):
print("T", "arguments=",arg)
super(T, self).__init__(arg, *args, **kwargs)
print("MRO---", [x.__name__ for x in T.__mro__])
t=T(10)
出力:
T arguments= 10
R arguments= 10
P
S arguments= 10
Q
MRO--- ['T', 'R', 'P', 'S', 'Q', 'Base', 'object']
これが機能するには、Base が MRO の最後から 2 番目のクラスである必要があることに注意してください。
Python プログラミング言語は、オブジェクト指向プログラミングのための広範な機能を提供します。この一連の関数では、特に正しく使用された場合、スーパー関数パラメーターが重要な役割を果たします。
この記事が、Python でのスーパー関数パラメーターの使用方法をより深く理解するのに役立つことを願っています。