เนื่องจาก Python อนุญาตให้ใช้การสืบทอดหลายแบบการถ่ายทอดทางพันธุกรรมใน Python มีลักษณะอย่างไร
ในภาษาที่มีการสืบทอดเดียวเช่น Java การสืบทอดจะถูกใช้เมื่อคุณสามารถพูดได้ว่าวัตถุหนึ่ง "is-a" ของวัตถุอื่นและคุณต้องการแบ่งปันรหัสระหว่างวัตถุ (จากวัตถุหลักไปยังวัตถุลูก) ตัวอย่างเช่นคุณสามารถพูดได้ว่าDogเป็นAnimal:
public class Animal {...}
public class Dog extends Animal {...}
แต่เนื่องจาก Python รองรับการสืบทอดหลายแบบเราจึงสามารถสร้างวัตถุโดยการรวมวัตถุอื่นเข้าด้วยกัน ลองพิจารณาตัวอย่างด้านล่าง:
class UserService(object):
def validate_credentials(self, username, password):
# validate the user credentials are correct
pass
class LoggingService(object):
def log_error(self, error):
# log an error
pass
class User(UserService, LoggingService):
def __init__(self, username, password):
self.username = username
self.password = password
def authenticate(self):
if not super().validate_credentials(self.username, self.password):
super().log_error('Invalid credentials supplied')
return False
return True
นี่เป็นการใช้งานที่ยอมรับได้หรือดีสำหรับการสืบทอดหลาย ๆ อย่างใน Python หรือไม่? แทนที่จะพูดว่ามรดกคือเมื่อวัตถุหนึ่ง "เป็น-เป็น" ของวัตถุอื่นเราจะสร้างUserรูปแบบประกอบด้วยและUserServiceLoggingService
ทั้งหมดตรรกะสำหรับฐานข้อมูลหรือเครือข่ายการดำเนินงานจะถูกเก็บไว้แยกจากUserรูปแบบโดยการวางไว้ในวัตถุและเก็บทุกตรรกะสำหรับการเข้าสู่ระบบในUserServiceLoggingService
ฉันเห็นปัญหาบางอย่างกับวิธีนี้คือ:
- สิ่งนี้สร้างวัตถุของพระเจ้าหรือไม่? ตั้งแต่
Userสืบทอดจากหรือประกอบด้วยUserServiceและLoggingServiceเป็นจริงตามหลักการของความรับผิดชอบเดียวหรือไม่ - ในการเข้าถึงวิธีการบนวัตถุพาเรนต์ / บรรทัดถัดไป (เช่น
UserService.validate_credentialsเราต้องใช้superสิ่งนี้ทำให้ยากขึ้นนิดหน่อยที่จะเห็นว่าวัตถุใดที่จะจัดการกับวิธีนี้และไม่ชัดเจนเหมือนพูด สร้างอินสแตนซ์UserServiceและทำสิ่งที่ต้องการself.user_service.validate_credentials
สิ่งที่จะเป็นวิธี Pythonic ในการใช้รหัสข้างต้น?