一、面向对象编程与面向过程编程对比
1、面向过程编程:核心过程二字,过程指的是解决问题的步骤,既先干什么、再干什么、后干什么,基于该思想的编程就好比在生产一条流水线,是一种机械式的思维方式。
优点:复杂的问题流程化进而简单化
缺点:可扩展性差
2、面向对象编程:核心是对象二字,对象是技能与特征的结合体,基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成的,在上帝眼里任何存在的事物都是对象,任何不存在的事物也都可以创造出来,是一种上帝式的思维方式
优点:可扩展性强
缺点:编程的复杂度要高于面向过程
二、类与对象
对象:对象是技能与特征的结合体
类:对象相同特征与技能的结合体
对象是具体存在的事物,而类则是抽象出来的概念,站在不同角度总结出来的类与对象是不同的
在现实世界中,现有一个个具体存在的对象,然后随着人类文明的发展才总结出类的概念
View Code
在程序中,是先定义出类的概念后调用类来产生对象
View Code
__init__方法
View Code
类是一系列对象相同特征与技能的结合体,既类体中最常见的就是变量与函数体,但其实类体中是可以存在任意python代码的,
类体中会在定义阶段立即执行,会产生一个类的名称空间,用来将类体代码执行过程中产生的名字都丢进去
总结:①类本质就是一个名称空间,或者说就是一个用来存放变量与函数的容器,
②类的用途之一就是当做名称空间,从其内部取出名字来使用
③类的用途之二是用来调用类产生对象
调用类产生对象:调用类的过程称之为类的实例化,调用类的返回值称之为类的一个对象
View Code
调用类发生了:
1、产生一个空对象
2、触发类中的__init__方法,将对象连同调用类括号内指定的参数一同传入__init__
类中定义的变量是类的数据属性,类可以用,对象也可以用,大家都指向同一个地址,类变量值一旦改变,所有对象都跟着改变
类中定义的函数是类的函数属性,类可以用,类来调用就是一个普通的函数,但其实类中定义的函数就是给对象用的,而且是绑定给对象用的
绑定方法:指向类的函数(特殊之处是绑定给谁就应该由谁调用)
类的函数:该传几个参数就传几个参数
三大特性之继承:
利用继承能来解决类与类之间的代码冗余问题
继承是一种新建类的方法,新建的类称之为子类(派生类),被继承的类称之为父类、基类、超类
继承的特性:子类可以遗传、重用父类的属性
python中继承类的特点:
1、在python中一个子类可以同时继承多个父类
2、在继承背景下说,python中类分为两种:新式类和经典类
新式类:但凡继承了object的类以及该类的子类都是新式类
python中一个类即便没有显示的继承任何类,默认就会继承object,即在python3中所有的类都是新式类
经典类:没有继承object的类以及该类的子类都是经典类
在单继承的基础下属性查找的顺序是:对象——》对象类——》父亲——》父类。。。
子类中重用父类的属性:
方式一:
在子类派生出的新方法中指名道姓的引用某一个类中的函数
与继承无关,访问的是父类中的函数没有自动传值功能
继承解决的是类与类之间代码冗余的问题,一定是一个类是另外一个类的子类
总结对象之间的相似之处得到类,总结类之间的相似之处得到的就是父类
多继承背景下属性查找的顺序:对象--》对象的类--》按照从左往右的顺序一个个的分支找下去
一旦出现菱形继承问题,新式类与经典类在属性查找上的区别是:
新式类:广度优先查找,在最后一个分支查找顶级类
经典类:深度优先查找,在第一个分支就查找顶级类
mro()查找的顺序:
在子类派生出的新的方法中重用父类功能的方式二
在子类中用super()方法
python2中:super(自己的类名,对象自己)
python3中:super()
调用super()方法会得到一个特殊的对象,该对象是专门用来引用父类中的属性,完全参照mro()列表 访问是绑定方法,有自动传值的效果
组合:
组合指的是一个对象拥有一个属性,该属性的值属于另外一个类的对象
组合通过一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接的将两个类关联、整合,从而减少类之间的代码冗余问题
多态:
多态指的是同一事物的不同形态
在多态背景下,可以不用考虑对象具体的类型的前提下直接使用对象多态的精髓:统一
父类只是用来建立规范的,不能用来实例化的,更无需实现内部方法。
python崇尚鸭子类型
封装:
装:往容器、名称空间内存入名字
封:代表存放于名称空间的名字给藏起来,这种隐藏对外不对内
在类内定义的属性前加__开头(没有__结尾)
总结:
1、__开头的属性实现的隐藏仅仅只是一种语法上的变形,并不会真正的限制类外部的访问
2、该变形操作只在类定义阶段检测语法时发生一次,类定义阶段之后新增的__开头的属性不会变形
3、如果父类不想让子类覆盖自己的属性,可以在属性前加__开头
4、peoperty装饰器是用来将类内的函数属性伪装为数据属性
绑定方法与非绑定方法
一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):
1. 绑定到类的方法:用classmethod装饰器装饰的方法。
为类量身定制
类.boud_method(),自动将类当作第一个参数传入
(其实对象也可调用,但仍将类当作第一个参数传入)
2. 绑定到对象的方法:没有被任何装饰器装饰的方法。
为对象量身定制
对象.boud_method(),自动将对象当作第一个参数传入
(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
复制代码
import settings
class MySQL:
def __init__(self,host,port):
self.host=host
self.port=port
@classmethod
def from_conf(cls):
print(cls)
return cls(settings.HOST,settings.PORT)
print(MySQL.from_conf) #>
conn=MySQL.from_conf()
conn.from_conf() #对象也可以调用,但是默认传的第一个参数仍然是类
复制代码
二:非绑定方法:用staticmethod装饰器装饰的方法
1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说
View Code
classmethod与staticmethod的区别
View Code
三、 元类
元类源自一句话,在python中一切皆对象,而对象都是由类实例化得到的,既然这样那样类也是对象,也是通过实例化得到的,内置类为type
调用关系是:
调用元类——》自定义的类
调用自定义的类——》自定义的对象
自定义类的三个关键组成部分
1 类名
2 类的基类们
3 类的名称空间
class关键字的底层的工作原理
1、先拿到类名(oldboyteacher)
2、再拿到类的基类们:(object,)
3、拿到类的名称空间(执行类体代码,将产生的名字放到类的名称空间也就是一个字典里,补充exec)
4、调用元类实例化得到自定义的类:、oldboyTeacher=type('oldboyTeacher',(object){})
实现代码
View Code
自定义元类来控制类的产生:
但凡继承了type的类才能称之为自定义的元类,否则就是一个普通的类
对象之所以可以调用是因为对象有一个函数__call__
实例化发生的三件事:
1、产生一个空对象
2、执行__init__方法,完成对象初始化属性的操作
3、返回初始化好的那个对象
自定义类来控制类的调用一、面向对象编程与面向过程编程对比
1、面向过程编程:核心过程二字,过程指的是解决问题的步骤,既先干什么、再干什么、后干什么,基于该思想的编程就好比在生产一条流水线,是一种机械式的思维方式。
优点:复杂的问题流程化进而简单化
缺点:可扩展性差
2、面向对象编程:核心是对象二字,对象是技能与特征的结合体,基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成的,在上帝眼里任何存在的事物都是对象,任何不存在的事物也都可以创造出来,是一种上帝式的思维方式
优点:可扩展性强
缺点:编程的复杂度要高于面向过程
二、类与对象
对象:对象是技能与特征的结合体
类:对象相同特征与技能的结合体
对象是具体存在的事物,而类则是抽象出来的概念,站在不同角度总结出来的类与对象是不同的
在现实世界中,现有一个个具体存在的对象,然后随着人类文明的发展才总结出类的概念
View Code
在程序中,是先定义出类的概念后调用类来产生对象
View Code
__init__方法
View Code
类是一系列对象相同特征与技能的结合体,既类体中最常见的就是变量与函数体,但其实类体中是可以存在任意python代码的,
类体中会在定义阶段立即执行,会产生一个类的名称空间,用来将类体代码执行过程中产生的名字都丢进去
总结:①类本质就是一个名称空间,或者说就是一个用来存放变量与函数的容器,
②类的用途之一就是当做名称空间,从其内部取出名字来使用
③类的用途之二是用来调用类产生对象
调用类产生对象:调用类的过程称之为类的实例化,调用类的返回值称之为类的一个对象
View Code
调用类发生了:
1、产生一个空对象
2、触发类中的__init__方法,将对象连同调用类括号内指定的参数一同传入__init__
类中定义的变量是类的数据属性,类可以用,对象也可以用,大家都指向同一个地址,类变量值一旦改变,所有对象都跟着改变
类中定义的函数是类的函数属性,类可以用,类来调用就是一个普通的函数,但其实类中定义的函数就是给对象用的,而且是绑定给对象用的
绑定方法:指向类的函数(特殊之处是绑定给谁就应该由谁调用)
类的函数:该传几个参数就传几个参数
三大特性之继承:
利用继承能来解决类与类之间的代码冗余问题
继承是一种新建类的方法,新建的类称之为子类(派生类),被继承的类称之为父类、基类、超类
继承的特性:子类可以遗传、重用父类的属性
python中继承类的特点:
1、在python中一个子类可以同时继承多个父类
2、在继承背景下说,python中类分为两种:新式类和经典类
新式类:但凡继承了object的类以及该类的子类都是新式类
python中一个类即便没有显示的继承任何类,默认就会继承object,即在python3中所有的类都是新式类
经典类:没有继承object的类以及该类的子类都是经典类
在单继承的基础下属性查找的顺序是:对象——》对象类——》父亲——》父类。。。
子类中重用父类的属性:
方式一:
在子类派生出的新方法中指名道姓的引用某一个类中的函数
与继承无关,访问的是父类中的函数没有自动传值功能
继承解决的是类与类之间代码冗余的问题,一定是一个类是另外一个类的子类
总结对象之间的相似之处得到类,总结类之间的相似之处得到的就是父类
多继承背景下属性查找的顺序:对象--》对象的类--》按照从左往右的顺序一个个的分支找下去
一旦出现菱形继承问题,新式类与经典类在属性查找上的区别是:
新式类:广度优先查找,在最后一个分支查找顶级类
经典类:深度优先查找,在第一个分支就查找顶级类
mro()查找的顺序:
在子类派生出的新的方法中重用父类功能的方式二
在子类中用super()方法
python2中:super(自己的类名,对象自己)
python3中:super()
调用super()方法会得到一个特殊的对象,该对象是专门用来引用父类中的属性,完全参照mro()列表 访问是绑定方法,有自动传值的效果
组合:
组合指的是一个对象拥有一个属性,该属性的值属于另外一个类的对象
组合通过一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接的将两个类关联、整合,从而减少类之间的代码冗余问题
多态:
多态指的是同一事物的不同形态
在多态背景下,可以不用考虑对象具体的类型的前提下直接使用对象多态的精髓:统一
父类只是用来建立规范的,不能用来实例化的,更无需实现内部方法。
python崇尚鸭子类型
封装:
装:往容器、名称空间内存入名字
封:代表存放于名称空间的名字给藏起来,这种隐藏对外不对内
在类内定义的属性前加__开头(没有__结尾)
总结:
1、__开头的属性实现的隐藏仅仅只是一种语法上的变形,并不会真正的限制类外部的访问
2、该变形操作只在类定义阶段检测语法时发生一次,类定义阶段之后新增的__开头的属性不会变形
3、如果父类不想让子类覆盖自己的属性,可以在属性前加__开头
4、peoperty装饰器是用来将类内的函数属性伪装为数据属性
绑定方法与非绑定方法
一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):
1. 绑定到类的方法:用classmethod装饰器装饰的方法。
为类量身定制
类.boud_method(),自动将类当作第一个参数传入
(其实对象也可调用,但仍将类当作第一个参数传入)
2. 绑定到对象的方法:没有被任何装饰器装饰的方法。
为对象量身定制
对象.boud_method(),自动将对象当作第一个参数传入
(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
复制代码
import settings
class MySQL:
def __init__(self,host,port):
self.host=host
self.port=port
@classmethod
def from_conf(cls):
print(cls)
return cls(settings.HOST,settings.PORT)
print(MySQL.from_conf) #>
conn=MySQL.from_conf()
conn.from_conf() #对象也可以调用,但是默认传的第一个参数仍然是类
复制代码
二:非绑定方法:用staticmethod装饰器装饰的方法
1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说
View Code
classmethod与staticmethod的区别
View Code
三、 元类
元类源自一句话,在python中一切皆对象,而对象都是由类实例化得到的,既然这样那样类也是对象,也是通过实例化得到的,内置类为type
调用关系是:
调用元类——》自定义的类
调用自定义的类——》自定义的对象
自定义类的三个关键组成部分
1 类名
2 类的基类们
3 类的名称空间
class关键字的底层的工作原理
1、先拿到类名(oldboyteacher)
2、再拿到类的基类们:(object,)
3、拿到类的名称空间(执行类体代码,将产生的名字放到类的名称空间也就是一个字典里,补充exec)
4、调用元类实例化得到自定义的类:、oldboyTeacher=type('oldboyTeacher',(object){})
实现代码
View Code
自定义元类来控制类的产生:
但凡继承了type的类才能称之为自定义的元类,否则就是一个普通的类
对象之所以可以调用是因为对象有一个函数__call__
实例化发生的三件事:
1、产生一个空对象
2、执行__init__方法,完成对象初始化属性的操作
3、返回初始化好的那个对象
自定义类来控制类的调用https://www.cnblogs.com/chenchuanjide/p/9512446.html