python的函数模块和控制流程
python中 oop概念 object oriented programing 面向对象编程
面向对象编程时以数据为核心
事先把整个程序运行过程中,先抽象成一个个类,将类实例化成对象后,让对象之间互操作,完成程序执行,
每个对象支持的数据加工方式是事先定义好的,
抽象指的是
比如提供的接口。有一定的计算能力,很多问题和提供的计算能力不是对应的,就要让2者通过程序员建立联系
把实例想象成一种新型变量,可以保存数据,甚至可以保存对自己支持 的数据的操作的办法
类就是用户自定义的类型,这个类型内部通告一些属性能保存数据,
给类真正赋值的过程就是实例化
类就是用户自定义的保存特定格式的数据类型,把这些类型中的属性进行赋值,从而能实例化具体的类型出来
类型是由状态集合和转换这些状态的操作集合组成
状态集合称为类属性,转换这些状态的操作称为类方法
方法只是对里面的数做操作的,也可以互操作,把其他的成员内容,在当前成员上执行某些操作,
一个类的行为和接口是通过方法来定义的
方法有两类,私有和公共
私有:只在自己内部使用
公共:外部可见
类名叫灯泡
对应接口有on,off,brighten 调高亮度,dim调暗亮度
每一个对象仅支持在类的接口所定义的操作
特定的请求就是方法所来规定的
消息传递就是调用,有个整数保存在变量名i1上,这种调用就等于向其传递了一个消息
对象是可以嵌套的
有什么接口就能接受什么消息
下面就可以发4种消息
类和类有这样三种关系
依赖 a-uses-b a用到了b类,没有b无法运行
聚合 a当中包含了b,类a包含了类b的对象
继承 描述特殊与一般关系
继承,先拥有动物的特性,再拥有自己独有的特性
父类也叫基类,超类
子类也叫派生类
init来初始化,事先实例出一个对象来
del用来销毁对象的
**创建类:
class ClassName(bases):从哪个父类进行继承
‘class documentation string’ 类文档
class_suite **
(1)类体可以包含:声明语句、类成员定义(数据成员、方法)
任何赋值语句都会创建类属性,
(2)如果不存在继承关系,基类bases可以为空
(3)类本身是可执行代码,直到运行后类对象才会存在,类可以实例化出来属于这个类的对象
class一执行有class对象,但是没有实例对象,只有对类做new以后才叫做实例化对象
(4)实例化的方法:instance_name=ClassName()表示类被调用,生成出来一个对象,每个是对象都会继承属性,获得自己的名称空间
每个实例对象都会继承 类的属性,并获得自己的名称空间;
(a其实在class中定义的) l1.a=
方法属于类,并不属于实例对象,实例对象主要是提供数据结构的
第一行就是文档,可以调用类文档
只有运行到它,类才会存在,非编译式语言,只能先定义后使用
def函数就是个方法,方法通常用来操作数据的
要想对实例进行调用,有两种机制
方法调用+()
每个实例对象相当于带有数据的记录,方法属于类,不属于对象,可以通过对象来调用类的方法,
有个类叫myclass,myinstance.
有方法method
调用myinstance.method()方法 相等于调用,myclass.method(myinstance)
每一次调用方法,相当于把实例化对象当参数传递给方法
必须有self参数,必须放在第一个,就是为了能接受基于累调用方法,把当前实例对象当参数传递给方法的一个接口
因为方法式用来处理实例的,必须基于实例来调用方法,能把当前实例当参数给传递方法
类属性对子类中的每一个对象都生效,而实例对象仅对当前实例有效,在类当中 ,赋值这种方法很少用,最多用来初始化
x。name式实例后的属性要通过方法调用生成的
init就是初始化的方法,这就是wsm上面的x有gender属性
所以init方法也被称为构造器
自我初始化的,能够构造一个对象应该拥有的所有功能来
为了让某一个类实例化对象出来以后,让对象立即拥有自己专用的数据,需要在定义类时定义一个init方法
定义了两个对象,tom,jerry
hello传递给voice关键字参数
dir函数可以获取类的属性
对整数来讲,取绝对值,加法运算等,这些方法只是构造一个特殊的定义i1=123,会调用自己的init方法
也可以用这个来获取。__dict__字典属性,获取类属性
告诉你属性和作用是什么键值对
int.dict
class表明是哪个类创建生成的
dict基于字典方式保存的属性
方法属于类的
i1的属性时int类继承来的
dict基于自己字典方式保留的属性
legb,local,e表示外层函数,G全局,b内建的,builtin
使用self+变量名引用的叫实例变量
全局变量属于模块级变量
类变量
类在实例化对象后,会继承类的变量,在自己的名称空间会保留一份
**类下面实例化了两个对象,当在1个对象引用spam时候,这个对象没有spam就去找类,类还没有就去找全局的,
x.spam=abc赋值abc,意味在实例自己的名称空间创建一个spam属性赋值abc,另外的spam还是hello,y自己没有就到上面去找,就是hell0,爬树
**
所有的print适合python2的, 3要换成()小括号
对象式编程三个重要概念,封装继承,多态
派生类=子类
多重继承代表可以从多个人那里获得遗产
父类的方法子类都可以使用
dir获取一个类所支持的所有方法
i1是实例,c3是类,c1,12父类
基于c3创建实例i1的时候,说明i1会把自己连接至c3,同时每个子类链接它的父类
继承就是由下而上,搜索此树,找出名称空间位置
如果调用i1.a会先再i1找有没有a,没有就找c3,没有,再找c1,由左而右,就是下面定义的顺序,给定的顺序决定了他们搜索的顺序
由下而上,由左往右
继承这种概念会导致子类从父类中即会继承爬树的方式,数据属性也就会继承方法,子类也可以无视
超类=父类
父类定义gender,子类定义name,根据子类实例化对象,子类中的名字,方法和父类的setinfo一样,所以子类把父类的重写覆盖了
调用 了父类的方法,子类在原来的方法内调用了父类的方法
自己定义完自己所实现的操作后,把父类的方法调用了一遍,回调,所以没有实现覆盖,实现了扩展第一个类是不是第二个类的子类+加法运算类似add
运算重载基本用不到,python2.2.开始引入了新的类,新式类
类的定义和实例化的方法