您的位置 首页 > 德语常识

python面向对象六大原则,python中面向对象

Composition,翻译为组合,其实就是组合,Python中的组合是一种面向对象的设计理念,跟模型有关。在组合中,一个称为组合的类包含另一个称为组件的类的对象。换句话说,复合类包含另一个类的组件。

python面向对象六大原则,python中面向对象

虽然继承的本质是它依赖于父级之间的关系,但组合的作用是允许复合类使用友元组合重用其包含的组件的实现。复合类不继承组件类接口,但可以利用它们的实现。

两个类之间的组合关系被认为是松耦合的。这意味着对组件类的更改很少影响组合类,但对组合类的更改永远不会影响组件类。

如何实现对象的组合:我们有一个像Employee这样的场景,但是每个员工都有一个地址,所以Address和Employee之间不存在继承关系。但是,员工确实有地址信息。我们应该如何表达这种关系呢?通过组合,我们首先定义Address类

class Address: def __init__(self, street, city, state, zipcode, street2=''): self.street=街道self.street2=street2 self.city=城市self.state=州self.zipcode=邮政编码def __str__(self ): line=[self.street] if self.street2: line.append(self.street2) line.append(f'{self.city}, {self.state} {self.zipcode}') return '\n' .join(lines) 定义了一个Employee 类,该类具有名为address 的属性。

class Employee: def __init__(self, id, name): self.id=id self.name=name self.address=None 这样,地址和雇员之间就存在松散的关系。

然后输出员工相关信息

class PayrollSystem: defCalculate_payroll(self,employees): print('Payroll') print('====================') for Employee inemployees: print(f'Payroll for: {employee.id} - {employee.name}') print(f'- check amount: {employee.calculation payroll()}') if employee.address: print('- 发送至: 发送') print(employee.address) print ('') 如果员工有地址,则打印员工的地址信息。

ifemployee.address:print('- Sent to:') print(employee.address) 组合的灵活设计比继承更灵活,因为它模拟了松耦合关系。组件类的更改对复合类影响很小或没有影响。

要更改行为,不要向层次结构添加新类,而是提供实现这些行为的新组件。

看上面的多重继承示例。想象一下您的新薪酬政策将如何影响您的设计。想象一下,如果需要新角色,您的类层次结构会是什么样子。正如我们之前所看到的,过度依赖继承可能会导致类爆炸。

最大的问题不是设计中类的数量,而是这些类之间关系的耦合程度。当引入更改时,紧密耦合的类会相互影响。

class ProductivitySystem: def __init__(self): self._roles={ '经理': ManagerRole, '秘书': SecretRole, '销售': SalesRole, '工厂': FactoryRole, } def get_role(self, role_id): role_type=self. _roles.get(role_id) if role_type is not : raise ValueError('role_id') return role_type() def track(self,employee,hours): print('员工生产力跟踪') print('==============================') 员工employee: employee.work(time) print('')class ManagerRole: def Perform_duties(self, hours): return f '{小时} 尖叫、尖叫几个小时。 'class SecretRole: def Perform_duties(self, hours): return f'{hours} 执行数小时的文书工作。 'class SalesRole: def Perform_duties(self, hours): return f'花费{hours} 打电话的时间。 'class FactoryRole: def Perform_duties(self, hours): return f' 生成小工具{hours} 小时。 “您可以定义批量角色来实施员工薪酬政策。

class PayrollSystem: def __init__(self): self._employee_policies={ 1: SalaryPolicy(3000), 2: SalaryPolicy(1500), 3: CommissionPolicy(1000, 100), 4: HourlyPolicy(15), 5: 小时政策y (9) } def get_policy( self ,employee_id):策略=self._employee_policies.get(employee_id)其他策略:返回ValueError(employee_id)返回策略defCalculate_payroll(self,employee):打印('工资单')打印('===================')Foremployee: print(f'Payroll for: {employee.id} - {employee.name}') print (f'- Check amount: {employee.calculate_payroll()} ') ifemployee.address: print('- Sent to:') print(employee.address) print('') 为每个员工维护一个内部工资政策数据库。发布以返回给定员工的薪资政策。

class PayrollPolicy: def __init__(self): self.hours_worked=0 def track_work(self, hours): self.hours_worked +=hoursclass SalaryPolicy(PayrollPolicy): def __init__(self, Weekly_salary): super().__init__() self.weekly_salary=Weekly_salary defCalculate_payroll(self): return self.weekly_salaryclass HourlyPolicy(PayrollPolicy): def __init__(self,hour_rate): super().__init__() self.hour_rate=hour_rate defCalculate_payroll(self): return self.hours_worked * self. hour_rateclass CommissionPolicy(SalaryPolicy): def __init__(self, Weekly_salary, Commission_per_sale): super().__init__(weekly_salary) self.commission_per_sale=Commission_per_sale @property def Commission(self): sales=self.hours_worked/5 退货销售额* self.commission_per_sale defCalculate_payroll(self): fix=super().calculate_payroll() return fix + self.commission 地址簿类AddressBook: def __init__(self): self._employee_addresses={ 1: Address('121 Admin Rd.', 'Concord', 'NH','03301'),2: 地址('67 Paperwork Ave','曼彻斯特','NH','03101'),3: 地址('15 Rose St','Concord','NH','03301 ) ', 'Apt. B-1'), 4: 地址('39 Sole St.', '康科德', 'NH', '03301'), 5: 地址('99 Mountain Rd.', '康科德', ' NH') ', '03301'), } def get_employee_address(self,employee_id): address=self._employee_addresses.get(employee_id) if not address: raise ValueError(employee_id) return addressAddressBook 维护员工ID 之间的关系有一组属性_雇员_地址。 get_employee_address 映射关系允许您根据员工ID 检索员工的地址,从而在员工和地址之间保持松散而非直接的关系。

在继续优化Address 类中__str__ 方法的实现之后,我们现在在打印地址对象时拥有更好的格式。

class Address: def __init__(self, street, city, state, zipcode, street2=''): self.street=街道self.street2=street2 self.city=城市self.state=州self.zipcode=邮政编码def __str__(self ): line=[self.street] if self.street2: line.append(self.street2) line.append(f'{self.city}, {self.state} {self.zipcode}') return '\n' .join(line)继续

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023