เนื่องจาก 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
รูปแบบประกอบด้วยและUserService
LoggingService
ทั้งหมดตรรกะสำหรับฐานข้อมูลหรือเครือข่ายการดำเนินงานจะถูกเก็บไว้แยกจากUser
รูปแบบโดยการวางไว้ในวัตถุและเก็บทุกตรรกะสำหรับการเข้าสู่ระบบในUserService
LoggingService
ฉันเห็นปัญหาบางอย่างกับวิธีนี้คือ:
- สิ่งนี้สร้างวัตถุของพระเจ้าหรือไม่? ตั้งแต่
User
สืบทอดจากหรือประกอบด้วยUserService
และLoggingService
เป็นจริงตามหลักการของความรับผิดชอบเดียวหรือไม่ - ในการเข้าถึงวิธีการบนวัตถุพาเรนต์ / บรรทัดถัดไป (เช่น
UserService.validate_credentials
เราต้องใช้super
สิ่งนี้ทำให้ยากขึ้นนิดหน่อยที่จะเห็นว่าวัตถุใดที่จะจัดการกับวิธีนี้และไม่ชัดเจนเหมือนพูด สร้างอินสแตนซ์UserService
และทำสิ่งที่ต้องการself.user_service.validate_credentials
สิ่งที่จะเป็นวิธี Pythonic ในการใช้รหัสข้างต้น?