uml类图几种关系的代码体现
时间: 2025-01-02 17:24:11 浏览: 12
### UML 类图中的关系及其代码实现
#### 继承 (Inheritance)
继承表示一种 "is-a" 的关系,在 Python 中可以通过 `class` 定义来体现这种父子类之间的关联。
```python
class Animal:
def speak(self):
pass
class Dog(Animal): # Dog is an Animal
def speak(self):
return "Woof!"
```
子类可以重写父类的方法并调用其属性[^1]。
#### 聚合 (Aggregation)
聚合是一种弱的 “has-a” 关系,意味着整体对象拥有部分对象但是不控制它们的生命期。这通常通过组合实例变量完成:
```python
class Department:
def __init__(self, name):
self.name = name
self.employees = []
class Employee:
def __init__(self, id, department=None):
self.id = id
self.department = department
hr_dept = Department('HR')
emp1 = Employee(101, hr_dept)
print(emp1.department.name) # 输出 'HR'
```
这里员工可以在创建时被分配给部门,也可以之后再设置所属部门[^2]。
#### 组合 (Composition)
组合也是一种强形式的 “has-a”,它暗示着当容器对象消失时组件也会随之销毁。Python 中可通过初始化参数传递依赖项:
```python
from datetime import date
class Address:
def __init__(self, street, city):
self.street = street
self.city = city
class Person:
def __init__(self, name, birth_date, address_info):
self.name = name
self.birth_date = birth_date
self.address = Address(*address_info)
person = Person("Alice", date.today(), ("Main St.", "Wonderland"))
del person # 当删除Person对象时Address也被自动清理
```
此例子展示了地址作为人的组成部分而存在;如果人不存在,则该特定住址也无意义[^3]。
#### 关联 (Association)
两个独立实体之间简单的双向或多向联系称为关联。此类连接可能涉及多个角色或方向上的导航权限。
```python
class Teacher:
def teach(self):
print(f"{self} teaches.")
class Student:
teacher = None
@classmethod
def set_teacher(cls, tchr):
cls.teacher = tchr
t = Teacher()
Student.set_teacher(t)
s = Student()
if s.teacher:
s.teacher.teach() # 可能会打印出教师教课的信息
```
在这个场景下,学生和老师相互作用但彼此间并没有所有权的概念[^4]。
#### 依赖 (Dependency)
依赖是指一个类使用另一个类的服务或接口的情况,通常是临时性的交互而不是长期持有对方引用。
```python
def send_email(email_service, recipient, message):
email_service.send(recipient=recipient, content=message)
class EmailService:
def send(self, **kwargs):
print(f'Sending "{kwargs["content"]}" to {kwargs["recipient"]}.')
email_svc = EmailService()
send_email(email_svc, "example@example.com", "Hello!")
```
函数 `send_email()` 对象仅在其内部短暂地利用到了邮件服务的功能[^5]。
阅读全文