Python学习---面向对象---类的定义、创建及对象方法的调用
程序员文章站
2023-12-26 15:39:57
...
Python编程—面向对象
- 写代码的原则
- 七原则
- 定义类
- 创建对象
- 给对象发消息
写代码的原则
高类聚,低耦合
(high cohesion, low coupling)
七原则
1、单一职责原则SRP(Single Responsibility Principle)
即一个类只负责一项职责
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
提高类的可读性,提高系统的可维护性;
变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则。
2、开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
3、里氏替换原则(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。
4、依赖倒转原则(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,
这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
了 依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造 成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
5、接口分离原则(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。即面向接口编程
6、“迪米特”法则
又叫最少知识原则,就是说,一个对象应当对其他对象有尽可能少的了解
① 在类的划分上,应该创建有弱耦合的类;
② 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
③ 在类的设计上,只要有可能,一个类应当设计成不变类;
④ 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
⑤ 尽量降低类的访问权限;
⑥ 谨慎使用序列化功能;
⑦ 不要暴露类成员,而应该提供相应的访问器(属性)。
7、.组合/聚合原则
又叫合成复用原则。原则就是在一个新的对象里面通过关联关系(包括组合关系和聚合关系)使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用其已有功能的目的。也就是,要尽量使用类的合成复用,尽量不要使用继承。
就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的。这个原则有一个简短的描述:要尽量使用合成、聚合,尽量不要使用继承。
1) 新对象存取成分对象的唯一方法是通过成分对象的接口
2) 这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不到的
3) 这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象
4) 合成、聚合可以应用到任何环境中去,而继承只能应用到一些有限环境中去
5) 导致错误的使用合成、聚合与继承的一个常见原因是错误的把“Has-a”关系当作“Is-a”关系。如果两个类是“Has-a”关系那么应使用合成、聚合,如果是“Is-a”关系那么可使用继承
在面向对象设计中,可以通过两种基本方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承。
1) 继承复用:实现简单,易于扩展。破坏系统的封装性,从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;只能在有限的环境中使用。(“白箱”复用 )
2) 组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作;可以在运行时动态进行。(“黑箱”复用 )
组合/聚合可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;
步骤一、定义类(分析用户需求)
1.数据抽象---找到和对象相关的属性 - 属性(找名词)
2.行为抽象---找到和对象相关的行为 - 方法(找动词)
步骤二、创建对象
1.调用构造器并执行__init__方法
步骤三、给对象发消息(调用对象的方法)
# 包装器,对数据做处理,过滤
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name[:-1] + '*'
# 如果返回王墨墨的名字,就只能返回王墨*
# 一个属性即可读,也可以写
@name.setter
@property
推荐阅读
-
Python学习---面向对象---类的定义、创建及对象方法的调用
-
python学习笔记之面向对象中的静态方法、类方法、属性方法总结
-
Python学习之面向对象(类的特殊方法)
-
Python面向对象编程中关于类和方法的学习笔记
-
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
-
Python面向对象编程中关于类和方法的学习笔记
-
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
-
python中面向对象_类_对象的概念与定义
-
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
-
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解