python 面向对象基础
- 基本概念
⑴对象。 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。 ⑵对象的状态和行为。 对象具有状态,一个对象用数据值来描述它的状态。 对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。 对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中 ⑶类。 具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。 类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。 类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。 ⑷类的结构。 在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。 ①一般--具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。 ②整体--部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。 ⑸消息和方法。 对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。 类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体。
- 面向对象与面向过程
面向过程: 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。 面向对象: 优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。 缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,无法预测最终结果。
- 类与对象的例子
类 对象 list l = [1,2,3] dict d = {'a':1}
- 定义类
class MyClass: pass
- 初始化函数
class Person def __init__(self,name): self.name = name
- 实例化
p = Person('hsr') 过程: 1、类名() 首先创出一个对象,建立了self变量 2、调用init方法,类名括号里的参数会被接收 3、执行init方法 4、返回self
- 属性
class Person def __init__(self,name): self.name = name #属性name
- 方法
class Person def __init__(self,name): self.name = name def sayHi(self): print('Hi')
- 静态属性(类属性)
class Person type = 'Animal' def __init__(self,name): self.name = name #所有的对象都共享这个type属性
如果对 对象.静态变量 进行修改,会创建一个新的,属于对象的变量(可以通过查看类和对象的__dict__查看)但有一种情况,如果静态变量是一个可变类型,比如列表,如果对列表中的元素进行修改,不会影响 对象.静态变量 的指向 - __dict__
#获取类,对象中的属性到一个字典,可以按字典的用法修改属性 print(Person.__dict__) p = Person('hsr') print(p.__dict__)
- self
必须写在第一个参数 self在定义时需要定义,但是在调用时会自动传入。 self的名字并不是规定死的,但是最好还是按照约定是用self self总是指调用时的类的实例。
- 类和对象的命名空间
1.创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 2.类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就是定义在类的方法中 3.创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性 在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
4.类属性可以被对象和类调用,但是对象的属性不能被类调用 - 绑定方法
#1.类里面的方法就是非绑定方法,实例里面的方法就是绑定的。 #2.既然上面说非绑定方法只能被实例调用,那么我们是如何调用一个类的非绑定方法的呢?实际上用类不能调用非绑定方法,无非是没有给self参数,那么我们给它就是。
- 组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好