Như tên ngụ ý, Trong thành phần, một trong các lớp được "tạo thành" từ một hoặc nhiều thể hiện của các lớp khác
Nói cách khác, một lớp là vùng chứa và lớp khác là nội dung và nếu bạn xóa đối tượng vùng chứa thì tất cả các đối tượng nội dung của nó cũng bị xóa
Thành phần mô hình mối quan hệ "có" giữa "Tổng hợp" và "Thành phần"
Thành phần được thể hiện thông qua một đường có hình thoi tại lớp tổng hợp trỏ đến lớp thành phần. Mặt tổng hợp có thể thể hiện bản chất của mối quan hệ. Số lượng cho biết số lượng hoặc phạm vi hợp lệ của các đối tượng Thành phần mà lớp Tổng hợp sẽ chứa
Trong sơ đồ ở trên, 1 biểu thị rằng lớp Composite chứa một đối tượng thuộc loại Thành phần. Cardinality có thể được thể hiện theo những cách sau
- Một số cho biết số lượng phiên bản Thành phần có trong Phiên bản tổng hợp
- Biểu tượng * cho biết rằng lớp Composite có thể chứa một số lượng khác nhau các phiên bản Thành phần
- Một phạm vi 1. 4 cho biết rằng lớp Tổng hợp có thể chứa một loạt các phiên bản Thành phần. Phạm vi được biểu thị bằng số lượng phiên bản tối thiểu và tối đa hoặc tối thiểu và nhiều phiên bản như trong 1. *
Đừng nhầm lẫn Composition với Inheritance. Thành phần có nghĩa là một đối tượng biết một đối tượng khác và ủy thác rõ ràng một số nhiệm vụ cho nó. Nói một cách đơn giản, Kế thừa mở rộng [kế thừa] một lớp, trong khi Thành phần sử dụng một thể hiện của lớp
Ví dụ: trong ví dụ bên dưới, chúng tôi đã khởi tạo lớp Mức lương bằng cách sử dụng self. obj_salary rồi sử dụng self. obj_salary trong phương thức total_salary bên trong lớp Nhân viên
>>> class Salary: def __init__[self, pay, bonus]: self.pay=pay self.bonus=bonus def annual_salary[self]: return [self.pay*12] + self.bonus >>> class Employee: def __init__[self, name, age, pay, bonus]: self.name=name self.age=age self.obj_salary=Salary[pay, bonus] def total_salary[self]: return self.obj_salary.annual_salary[] >>> emp = Employee['max', 25, 15000, 10000] >>> print[emp.total_salary[]] output:- 190000
Trong ví dụ của chúng tôi, lớp Nhân viên đóng vai trò như Lớp chứa và lớp Lương bên trong lớp Nhân viên đóng vai trò như nội dung trong đó. Thành phần đại diện cho một phần của mối quan hệ. trong ví dụ của chúng tôi. Tiền lương là một phần của nhân viên
Thành phần là một trong những khái niệm quan trọng của lập trình hướng đối tượng [OOPs]. Thành phần về cơ bản cho phép chúng tôi tạo các đối tượng kiểu phức tạp bằng cách kết hợp các loại đối tượng khác trong chương trình. Thành phần đại diện cho loại 'có mối quan hệ' hoặc chúng ta có thể gọi thành phần là 'có mối quan hệ' trong khái niệm OOP. Nó có nghĩa là một lớp tổng hợp hiện diện trong chương trình có thể chứa các đối tượng từ các thành phần của lớp khác và loại mô hình quan hệ này được gọi là có một mối quan hệ
- Ghi chú. Các lớp chứa các đối tượng từ các lớp khác trong chương trình được gọi là các lớp tổng hợp trong khi các lớp mà chúng ta sử dụng để tạo các kiểu mô hình quan hệ phức tạp hơn được gọi là các thành phần
Nhìn vào sơ đồ UML sau để hiểu về thành phần hoặc có một mô hình quan hệ
tổng hợp
Trong sơ đồ UML ở trên, chúng ta đã biểu diễn hai loại lớp khác nhau. e. , composite và linh kiện. Mối quan hệ giữa vật liệu tổng hợp và các thành phần là thành phần. Như chúng ta có thể thấy rằng chúng ta đã biểu diễn thành phần thông qua một đường trong đó viên kim cương từ lớp tổng hợp hướng về phía lớp thành phần biểu thị mối quan hệ thành phần
Trong quan hệ thành phần, phía lớp tổng hợp đại diện cho lực lượng. Về cơ bản, số lượng có nghĩa là số phạm vi hoặc đối tượng hợp lệ của lớp thành phần mà một lớp tổng hợp chứa trong đó. Như chúng ta có thể thấy trong sơ đồ trên, số 1 trong lớp tổng hợp chỉ đại diện cho đối tượng của loại thành phần lớp có mặt trong lớp tổng hợp thông qua thành phần
Chúng ta có thể thể hiện cardinality của thành phần thông qua các cách sau
- Bằng cách sử dụng một số [1, 2, 3, v.v. ]
- Bằng cách sử dụng biểu tượng *
- Bằng cách xác định một phạm vi trong hỗn hợp [1. 3, 2. 5, v.v. ]
Thành phần cho phép chúng tôi sử dụng lại mã của mình bằng cách thêm các đối tượng với các đối tượng mới khác, tính năng không có trong khái niệm thừa kế
Thành phần trong Python
Chúng tôi biết rằng Python là ngôn ngữ lập trình hướng đối tượng nên nó cũng tuân theo phương pháp thành phần. Trong Python, thành phần cho phép chúng ta sử dụng lại việc triển khai đối tượng lớp thành phần trong các lớp tổng hợp. Chúng ta phải nhớ rằng lớp tổng hợp không thực sự kế thừa giao diện của lớp thành phần mà nó đang điều chỉnh giao diện của các thể hiện của lớp thành phần
Mối quan hệ thành phần trong Python giữa lớp tổng hợp và lớp thành phần được coi là liên kết lỏng lẻo. Điều đó có nghĩa là nếu chúng ta thay đổi lớp thành phần thì nó sẽ hiếm khi ảnh hưởng đến lớp tổng hợp và nếu chúng ta thay đổi lớp tổng hợp thì nó sẽ không bao giờ ảnh hưởng đến lớp thành phần. Tính năng sáng tác này trong Python cung cấp cho chúng tôi khả năng thích ứng tốt hơn với những thay đổi. Nó cũng cho phép chúng tôi giới thiệu các thay đổi mới trong ứng dụng theo yêu cầu mà không ảnh hưởng đến mã hiện có
Đầu tiên, chúng ta sẽ hiểu điều này thông qua một ví dụ cơ bản nơi chúng ta sẽ sử dụng khái niệm cơ bản về thành phần trong chương trình Python của mình và sau đó chúng ta sẽ tiếp tục với việc sử dụng thành phần
Thí dụ
# create a component class in program class ComponentClass: # create the composite class constructor in component def __init__[self]: print['An object for the Component class is created ...'] # using the composite class instance method def mk1[self]: print['The Component class method mk1[] is executed successfully ...'] # create a composite class in program class CompositeClass: # create a class constructor for composite class def __init__[self]: # creating an instance for the component class self.inst1 = ComponentClass[] print['An object for the Composite class is also created ...'] # creating a class instance method for composite class def mk[self]: print['The Composite class method mk[] is also successfully executed ...'] # calling the mk1[] method of component class in composite class self.inst1.mk1[] # creating an instance for the composite class inst2 = CompositeClass[] # calling out mk[] method from the composite class inst2.mk[]
đầu ra
An object for the Component class is created ... An object for the Composite class is also created ... The Composite class method mk[] is also successfully executed ... The Component class method mk1[] is executed successfully ..
Giải trình. Trong chương trình đã cho ở trên, chúng ta đã tạo hai lớp i. e. , lớp tổng hợp và lớp thành phần và đặt tên cụ thể cho chúng. ComponentClass và CompositeClass chia sẻ mối quan hệ 'có một loại' giữa chúng tôi. e. , quan hệ thành phần. Chúng tôi cũng đã tạo một đối tượng cho cả hai lớp. Để sử dụng thành phần giữa các lớp, chúng tôi đã tạo một hàm tạo cho lớp thành phần. Chúng ta có thể thấy rằng chúng ta cũng đã định nghĩa hai phương thức vào các lớp tương ứng. e. , mk[] & mk1[]. Chúng ta đã gọi phương thức mk1[] của lớp thành phần bên trong phương thức mk[] của lớp tổng hợp. Vì vậy, bất cứ khi nào chúng ta gọi mk1[] trong chương trình, phương thức mk[] cũng sẽ được gọi ra. Chúng ta cũng có thể thấy điều này trong đầu ra của chương trình
- Đó là cách chúng tôi sử dụng quan hệ thành phần giữa lớp tổng hợp và lớp thành phần trong chương trình Python của chúng tôi. Bây giờ, hãy tiếp tục với việc sử dụng bố cục trong Python
Sử dụng Thành phần trong Python
Như chúng ta đã thảo luận rằng với sự trợ giúp của thành phần, chúng ta có thể sử dụng giao diện của các đối tượng lớp thành phần trong lớp tổng hợp. Chúng tôi cũng có thể sử dụng lại mã cho ví dụ và giao diện của nó. Bằng cách này, chúng tôi có thể tiết kiệm rất nhiều thời gian và viết mã cho nó. Hãy cùng tìm hiểu cách bố cục trong Python sẽ thực sự hữu ích cho chúng ta trong cuộc sống hàng ngày thông qua chương trình ví dụ sau
- Đầu tiên tạo một tệp chương trình Python bằng cách viết chương trình sau vào đó
# create an address class in the program class AddressClass: # define the components of the address class with default function def __init__[self, Street1, LiveinCity, LiveinState, PostalCode, Country, Street2 = '']: # defining components of address class as variables self.Street1 = Street1 self.Street2 = Street2 self.LiveinCity = LiveinCity self.LiveinState = LiveinState self.PostalCode = PostalCode self.Country = Country # define the properties of the address class with default function def __str__[self]: TotalLines = [self.Street1] # using the if method to append the lines if self.Street2: lines.append[self.Street2] # printing following components in next line TotalLines.append[f'{self.LiveinCity}, {self.LiveinState} {self.PostalCode} {self.Country}'] return '\n'.join[TotalLines] # appending the lines for output
Sau khi viết chương trình trên, hãy lưu tệp Python này vào đĩa [Chúng tôi đã lưu nó bằng cách thay đổi. tên py trong thiết bị]
- Sau đó, mở một tệp chương trình Python khác và viết chương trình sau vào đó
# import the python program script for the address class from changing import AddressClass # define the elements for the address class Address1 = AddressClass['55 Main St.', 'Concord City', 'NH25', '03301', 'Mexico'] Address2 = AddressClass['36 Side St.', 'New Mexico City', 'NH67', '033207', 'Mexico'] # print the address elements in the output print['The first address element we added is: '] print[Address1] print['The second address element we added is: '] print[Address2]
đầu ra
The first address element we added is: 55 Main St. Concord City, NH25 03301 Mexico The second address element we added is: 36 Side St. New Mexico City, NH67 033207 Mexico
Giải trình
Trong chương trình trên, chúng ta đã sử dụng quan hệ thành phần trong lớp địa chỉ mà chúng ta đã định nghĩa trong phần thay đổi. tập tin kịch bản py
Trong lớp địa chỉ, chúng ta cũng đã định nghĩa các thành phần của nó. Sau đó, chúng ta đặt các thành phần của lớp địa chỉ thành các biến để nó có thể lưu trữ các giá trị trong đó. Sau đó, chúng tôi đã sửa đổi các thành phần và nối thêm các dòng cho các thành phần trong đầu ra
Chúng tôi đã sử dụng câu lệnh if cho nó. Sau đó, chúng tôi đã lưu tệp script trong thiết bị. Chúng tôi đã mở một tệp Python khác sau đó như chúng tôi có thể thấy ở trên. Trong tệp thứ hai, chúng tôi đã nhập lớp địa chỉ từ tệp đang thay đổi. tập tin kịch bản py. Chúng tôi đã sử dụng addressclass[] để thêm các thành phần của địa chỉ trong đó. Sau đó, các yếu tố chúng tôi đã thêm vào, chúng tôi lưu trữ chúng dưới dạng biến. Sau đó, chúng tôi đã in các thành phần địa chỉ được lưu trữ trong các biến ở đầu ra
Chúng tôi đã triển khai hàm __str[]__ trong lớp địa chỉ để sửa đổi các thành phần của lớp địa chỉ i. e. , cách chúng được hiển thị và nối thêm dòng vào đầu ra. Trong khi chúng ta sử dụng các thành phần của lớp địa chỉ, nó cũng sẽ gọi hàm __str[]__ để gọi ra. Điều này là do hàm quan hệ tổng hợp mà chúng ta đã sử dụng trong lớp địa chỉ. Nó sẽ giúp chúng ta sử dụng lại code đã viết và giao diện của hàm __str[]__