Python Language
多型
サーチ…
基本多型
多態性は、オブジェクトの種類に関係なくオブジェクトに対してアクションを実行する能力です。これは、一般に、基本クラスを作成し、すべてが同じシグネチャを持つメソッドを実装する2つ以上のサブクラスを持つことによって実装されます。これらのオブジェクトを操作する他の関数またはメソッドは、操作の対象となるオブジェクトのタイプに関係なく、型チェックを最初に行う必要なく、同じメソッドを呼び出すことができます。クラスXがクラスYを拡張するオブジェクト指向用語では、Yはスーパークラスまたはベースクラスと呼ばれ、Xはサブクラスまたは派生クラスと呼ばれます。
class Shape:
"""
This is a parent class that is intended to be inherited by other classes
"""
def calculate_area(self):
"""
This method is intended to be overridden in subclasses.
If a subclass doesn't implement it but it is called, NotImplemented will be raised.
"""
raise NotImplemented
class Square(Shape):
"""
This is a subclass of the Shape class, and represents a square
"""
side_length = 2 # in this example, the sides are 2 units long
def calculate_area(self):
"""
This method overrides Shape.calculate_area(). When an object of type
Square has its calculate_area() method called, this is the method that
will be called, rather than the parent class' version.
It performs the calculation necessary for this shape, a square, and
returns the result.
"""
return self.side_length * 2
class Triangle(Shape):
"""
This is also a subclass of the Shape class, and it represents a triangle
"""
base_length = 4
height = 3
def calculate_area(self):
"""
This method also overrides Shape.calculate_area() and performs the area
calculation for a triangle, returning the result.
"""
return 0.5 * self.base_length * self.height
def get_area(input_obj):
"""
This function accepts an input object, and will call that object's
calculate_area() method. Note that the object type is not specified. It
could be a Square, Triangle, or Shape object.
"""
print(input_obj.calculate_area())
# Create one object of each class
shape_obj = Shape()
square_obj = Square()
triangle_obj = Triangle()
# Now pass each object, one at a time, to the get_area() function and see the
# result.
get_area(shape_obj)
get_area(square_obj)
get_area(triangle_obj)
私たちはこの出力を見るべきです:
無し
4
6.0
多形性がなければ何が起こるでしょうか?
ポリモーフィズムがなければ、オブジェクトに対してアクションを実行して正しい呼び出し方法を決定する前に型チェックが必要な場合があります。次のカウンタの例は、前のコードと同じタスクを実行しますが、多態性を使用しない場合、 get_area()
関数はより多くの作業を行う必要があります。
class Square:
side_length = 2
def calculate_square_area(self):
return self.side_length ** 2
class Triangle:
base_length = 4
height = 3
def calculate_triangle_area(self):
return (0.5 * self.base_length) * self.height
def get_area(input_obj):
# Notice the type checks that are now necessary here. These type checks
# could get very complicated for a more complex example, resulting in
# duplicate and difficult to maintain code.
if type(input_obj).__name__ == "Square":
area = input_obj.calculate_square_area()
elif type(input_obj).__name__ == "Triangle":
area = input_obj.calculate_triangle_area()
print(area)
# Create one object of each class
square_obj = Square()
triangle_obj = Triangle()
# Now pass each object, one at a time, to the get_area() function and see the
# result.
get_area(square_obj)
get_area(triangle_obj)
私たちはこの出力を見るべきです:
4
6.0
重要な注意点
カウンターの例で使用されるクラスは "新しいスタイル"クラスであり、Python 3が使用されている場合は暗黙的にオブジェクトクラスから継承されています。多態性はPython 2.xと3.xの両方で機能しますが、型(input_obj)のためPython 2.xインタプリタで実行されると多相反例コードは例外を発生させます。彼らは明示的に割り当てられていないされない地域で、その結果、オブジェクトから継承されていない場合は名前ではなく、クラス名の「インスタンス」を返します。
ダックタイピング
Pythonで利用可能なダックタイピングの形で継承されていない多態性。これは、クラスに同じメソッドが含まれている限り、Pythonインタプリタはそれらを区別しないことを意味します。実行時に呼び出しのチェックだけが行われるからです。
class Duck:
def quack(self):
print("Quaaaaaack!")
def feathers(self):
print("The duck has white and gray feathers.")
class Person:
def quack(self):
print("The person imitates a duck.")
def feathers(self):
print("The person takes a feather from the ground and shows it.")
def name(self):
print("John Smith")
def in_the_forest(obj):
obj.quack()
obj.feathers()
donald = Duck()
john = Person()
in_the_forest(donald)
in_the_forest(john)
出力は次のとおりです。
クアァアック!
アヒルには白い灰色の羽があります。
その人はアヒルを模倣する。
その人は地面から羽をとり、それを示します。