LuffyX学习笔记3.1-面向对象编程

一、面向对象(Objected-Oriented)

  • 与面向过程相对,过程式的编程方式,很难用程序来表示许多个体,个体有一些数据、动作,个体之间还有包含关系。
  • OOP三大特性,封装、继承、多态(Encapsulation、Inheritance、Polymorphisn)
  • OOP里,所有的对象都应该有一个类。
  • OOP可扩展性高,复杂程度高
  • 在面向对象领域最先取得辉煌成功的是C++语言。
  • Java向着更纯粹的面向对象范式靠拢。
  • Python也是一门面向对象语言,但是也允许程序员以纯粹的面向过程的方式来使用它。

二、类(Class)

  • 类的属性(Attribute),数据属性、方法属性

  • 将东西根据属性归类,将object归为class

  • 方法(Method)也是一种属性,表示动作

      class Bird(object):
          have_feather = True
          way_of_reproduction = 'egg'
          def move(self, dx, dy):
              position = [0,0]
              position[0] = position[0] + dx
              position[1] = position[1] + dy
              return position
    

三、对象(Object)

  • 建立一个对象(实例化): 对象名 = 类名()
  • 程序中,对象就是变量。对象=数据+方法(Data+Method)
  • 一个对象都至少有一个接口(interface),接口用于连接外部信息和隐藏内部信息(Communication和Protection)

四、继承(Inheritance)–派生、重用、组合

A、B都是一个类:
  • 继承:A是B,那么A就继承了B。

  • 派生:除了B以外的属性,A还可以有别的属性,这就叫派生。如果该属性B也有,那么以A派生出的新的属性为准。

  • 重用:B里的某个方法属性A想调用,但又有所添加,那么在派生新的方法属性时,可以重用B的属性。
    两种方法实现重用:
    1.指名道姓

      Hero.attack(self,enemy)
    

    2.super() 依赖继承

      super().attack(enemy)  --python3
      super(Garen,self).attack(enemy)  --python2
    
  • 组合:A有B的属性,那么把B作为一个属性添加到A里。

继承的属性查找:
  • 在Java和C#里,子类只能继承一个父类,而python可以继承多个父类。
  • 查找方法有两种:深度优先(用于经典类,先找大爸的祖宗,再找二爸的祖宗)和广度优先(用于新式类)。
  • python2里,有经典类(没有继承object的类)和新式类(继承object的类)
  • python3里,都是新式类
  • 新式类,有mro()方法,可以用于查看该类继承属性查找的顺序

抽象化与归一化
借用第三方库abc模块可以实现方法名字的归一化

	improt abc
	class Animal(mataclass=abc.ABCMeta):
		@abc.abstractmethod
		def talk(self):
			pass

五、多态(Polymorphisn)

  • 多态:
  • 多态性:

六、封装(Encapsulation)

  • 在类中,变量名前加__,可以把变量隐藏。
  • 在类外部无法直接使用obj.__AttrName
  • 在类内部可以直接使用obj.__AttrName
  • 子类无法覆盖父类__开头的属性

七、property、绑定与非绑定、反射、抽象类

property
  • 在方法前加@property,可以实现调用方法不加括号
  • setter和deleter可以实现改和删
绑定与非绑定

绑定方法:绑定给谁,就由谁来调用,并且把调用者当做第一个参数传入

  • 绑定对象的方法:在类内定义的没有被任何装饰器装饰的方法
  • 绑定类的方法
    @classmethod
    可以避免由于类名更改而影响需要调用类的地方
    不需要实例化也能调用

非绑定方法:不与类或者对象绑定
@staticmethod
相当于一个普通函数

反射

通过字符串映射到对象的属性
查询有无:hasattr(obj,name),返回True/False
调用:getattr(obj,name,default)
改:setattr(obj,name,value)
删:delattr(obj,name)

八、内置方法

类的专有方法:
¥__init__ :构造函数,在生成对象时执行
¥__del__ :析构函数,释放对象时使用
¥__repr__ : 打印,转换
¥__getitem__: 按照索引获取值,可以用于
¥__setitem__ : 按照索引赋值,可以用于
¥__delitem__: 删除索引时调用
¥__len__: 获得长度
¥__cmp__: 比较运算
¥__call__: 函数调用,实例化时执行(先造一个空对象obj,初始化obj,返回obj)
¥__new__:用于类内部实例化对象
¥__str__: 打印对象的时候执行,print(obj)

九、面向对象的软件开发

1.面向对象分析
需求分析-归纳对象-建立需求模型
2.面向对象设计
类的设计(属性+方法)-设计类的层级(利用继承与派生)-程序设计
用流程图描述
3.面向对象编程
写代码
4.面向对象测试
5.面向对象维护

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值