面向对象编程的基本规则 python例子

一、面对过程和面向对象的比较

 

面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素

个人理解:其实就是函数式编程,最简单粗暴地决定问题

缺点:没有面向对象易维护、易复用、易扩展

 

面向对象

优点:易维护、易复用、易扩展。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护

个人理解:就是要解决问题同时多些思考,把某个功能抽象出来成对象,设计以后更加容易拓展和复用的程序

缺点:性能比面向过程低

 

例子:

老板给个需求:实现中秋节所有商品打六折功能

# 面向过程 如果以后需求不会怎么改动 这样做是正确的
def get_discount_price(price):
    return price * 0.6

# 面向对象 考虑拓展性 知道以后需求会拓展(增加其他节日、中秋节规则改变等)
class Festival(object):
    def get_discount_price(price):
        return price

class MidAutumn(Festival):
    def get_discount_price(price):
        return price * 0.6

 

去权衡设计是否会拓展很重要

 

二、两个标准:低耦合和高内聚

就是指模块之间低耦合、模块内部高内聚,以追求软件系统的可重用和易维护。一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。实际上这两个规则可能会处于冲突情况,这就要结合实际情况去考虑了。

低耦合:模块之间的联系越少越好,依赖越少越好

高内聚:指模块的功能越集中越好,类似于单一功能原则

 

 

三、三大基本特征

1、封装

隐藏细节、提供接口

# 封装
class Dog(object):
    def __init__(self, name):
        self.name = name
        self.age = 0

    def set_age(self, age):
        self.age = 3

dog = Dog('boby')
dog.age = 2  # 不合理的赋值
dog.set_age(2)  # 封装,隐藏self.age成员变量细节

 

2、继承

是指在已存在的类的基础上扩展产生新的类。

子类继承了父类,它拥有父类的所有特性,是实现代码重用、扩展软件功能的重要手段。

 

# 继承
class Person(object):
    def __init__(self, name):
        self.name = name

class Student(Person):  # Student类继承Person类
    def set_school(self, school):
        self.school = school

 

3、多态  

基本含义是“拥有多种形态”,具体指在程序中用相同的名称来表示不同的含义。

例如:用同一方法名来表示不同的操作。

条件①必须要有继承的情况存在;
条件②在继承中必须要有方法覆盖(重写);
条件③必须由父类的引用指向派生类的实例,并且通过父类的引用调用被覆盖的方法;

# 多态
class Animal(object):
    def __init__(self, name):
        self.name = name

    def roar(self):
        print 'animal~'

class Dog(Animal):
    def roar(self):  # 方法重写 多态
        print 'woof'

class Cat(Animal):
    def roar(self):  # 方法重写 多态
        print 'miaow'

注: python是弱类型,没有重载说法

 

能够根据子类对象的不同,得到不同的结果,这就是多态性。

 

 

重载和重写

 

 

 

四、四种关系:依赖、关联、聚合和组合关系

 

1、聚会和组合是关联关系的一种
2、这几种关系的耦合度从小到大  依赖 < 关联 < 聚合 < 组合

# 一个简单的宠物类
class Cat(object):
	def __init__(self, name):
		self.name = name
		self.master = None

	@classmethod
	def speak(self):
		print 'meow'

依赖关系

# 依赖 局域变量、方法的形参、静态方法的调用
class Person(object):
	def __init__(self, name):
		self.name = name

	def play_pet(self):
		pet = Cat('kitt')  # 局域变量调用
		pet.speak()

	def touch_pet(self):
		Cat.speak()  # 静态方法调用

	def talk_pet(self, pet):
		pet.speak()  # 方法的形参

关联关系

# 关联 一般做成员变量来实现有,单向\双向关联 耦合度:单向 < 双向
class Person(object):
	def __init__(self, name):
		self.name = name
		self.pet = Cat('kitt')  # 成员变量单项关联
		self.pet.master = self  # 双向关联

聚合关系

# 聚合 关联关系的一种 整体与部分的关系,他们之间存在着包容关系,整体和部分,可以分离
class Person(Person):
	def __init__(self, name):
		self.name = name
		self.pet = Cat('kitt')  # 包含的关系 人和宠物可以分离

组合关系

class Head(object):
	def comments(self):
		print 'it is a head'

# 组合也是整体与部分的关系,但是整体与部分不可以分开,他们之间是共生共死的
class Person(object):  # 整体(多对一)
	def __init__(self, name):
		self.name = name
		self.head = Head()  # 组合关系 人和头不可以分离

 

 

五、五大设计原则

1、单一职责原则 Single Duty

核心思想:一个类应该只有一个引起它变化的原因。

 

2、开放封闭原则Open Closed Principle

核心思想:对扩展开放,对修改封闭。

 

3、里氏替换原则 Liskov Subsitution Principle

核心思想:子类必须能够替换掉它们的父类型。

 

4、接口隔离原则 InterFace Segregation Principle

核心思想:使用多个小的专门的接口,而不要使用一个大的总接口.

 

5、依赖倒置原则 Dependency Inversion Principle

核心思想: 高层模块不应该依赖底层模块,两者都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。

 

未完待续

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值