欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

上一篇:

下一篇: