Ich war beeindruckt, als ich Mr. Masudas Wie schreibe ich "Fallklassifizierung" las. Alles begann mit Versuch und Irrtum und fragte sich, ob dies mit Python möglich wäre. Ich wollte es in meinen eigenen Notizen behalten, aber ich dachte, dass einige Leute vielleicht ähnliche Probleme haben könnten, Ich habe beschlossen zu posten.
Betrachten Sie als Beispiel den Code, um den Bereich einer Figur zu finden.
def calculate_area(shape_type, shape_info):
if shape_type == 'triangle':
return shape_info['bottom'] * shape_info['height'] / 2
if shape_type == 'rectangle':
return shape_info['bottom'] * shape_info['height']
Ich bin nicht glücklich darüber, dass die Anzahl der if-Anweisungen in der Funktion mit zunehmender Anzahl von Zahlen zunimmt. (Dies ist ein einfaches Beispiel, aber es ist schwierig zu beheben, wenn es verschachtelt ist.)
Lassen Sie uns als vorläufige Vorbereitung eine Klasse für jede Figur vorbereiten.
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
def __init__(self, shape_info):
self.shape_info = shape_info
@abstractmethod
def calculate_area(self):
pass
class Triangle(Shape):
def calculate_area(self):
return self.shape_info['bottom'] * self.shape_info['height'] / 2
class Rectangle(Shape):
def calculate_area(self):
return self.shape_info['bottom'] * self.shape_info['height']
Wir haben die Triangle-Klasse und die Rectangle-Klasse vorbereitet. Wenn dies jedoch alles ist, mit welcher Klasse wird beim Aufruf für jeden shape_type instanziiert Es scheint notwendig zu sein, die Fälle zu trennen.
if shape_type == 'triangle':
shape = Triangle(shape_info)
if shape_type == 'rectangle':
shape = Rectangle(shape_info)
Mit Enum können Shape_Type und Klassenname verknüpft werden. Mit eval können Sie den Inhalt eines Strings so ausführen, wie er als Python-Syntax vorliegt.
class ShapeType(Enum):
triangle = 'Triangle'
rectangle = 'Rectangle'
@classmethod
def get_shape_instance(cls, shape_type, shape_info):
return eval(cls[shape_type].value)(shape_info)
Wenn Sie es so schreiben, kennen Sie die Implementierungsklasse nicht. Sie können ShapeType wie eine Schnittstelle verwenden. Beim Anruf wird es wie folgt sein.
shape = ShapeType.get_shape_instance(shape_type, shape_info)
Weil dies mein erster Beitrag ist und ich noch studiere Der Text enthält möglicherweise einige Mängel, aber bitte verzeihen Sie mir. Ich hoffe dieser Artikel hilft jemandem.