什么是面向过程:
面向过程是一门编程思想,核心是过程二字,过程指的是解决问题的步骤,即先做什么再做什么,基于该编程思想编写程序编写程序,如流水线一般,这是一种机械式的思维方式
优点是:将复杂的问题流程化,进而简单化
缺点:牵一发而动全身,可扩展性差
这里要注意面向过程的编程思想就是函数的使用,这句话是错误的,面向过程思想是一门思想,与任何技术无关
什么是面向对象:
面向对象是一门编程思想,核心是对象二字,对象指的是 ‘’‘特征与技能’的结合体,基于该编程思想编写程序,要有一种上帝的思维方式
优点是:可扩展性高
缺点:编写程序的复杂程度比面向过程高
什么是类:
类指的是类型,类别
现实社会中:
先有一个个的对象,经过社会的发展,总结出一个个的类
在程序中:
必须先有类,然后通过类来调用类
对象指的是特征与技能的结合体,类指的是一系列对象相同的特征与技能的结合体
对象是实际存在的,而类是抽象出来的
定义类的语法:
class 关键字: 帮你产生类 类名规范是驼峰式
对象之间相同的特征(属性)
对象之间相同的技能 (方法)
函数的名称空间:
在调用函数时产生,函数调用结束后销毁
对象的名称空间:
在调用类时产生
类的名称空间:
在定义阶段,就会产生名称空间,会将类中所有的名字都丢进这个名称空间
对象的产生:
调用类时,便会产生对象
类名+()产生对象,若有对象的属性,则必须要传参()
什么是实例化,什么是实例?
调用类产生对象的过程是实例化,对象则是类的实例
*函数和方法的区别:
函数要手动传self,方法不用,在类中,如果是一个函数,用类来调用,如果是方法,用对象来调用
*如果类非要调用方法,则就是当函数来用,则必须遵循函数的传参规则,函数要传几个参数就要传几个
*类中的所有方法和函数都是绑定给对象使用的,不加装饰器时,类中所有的方法都是对象的绑定方法
绑定方法都有自动传值的功能,传递是对象或这类的本身
对象的绑定方法:由对象来调用,谁来调用就将谁作为第一参数传入,若还有其他参数,会一并传入
类的绑定方法:由类来调用,谁来调用就将谁作为第一参数传入,若还有其他的参数,会一并传入, (@classmethod)
类的静态方法(非绑定方法):由类或对象来调用,不论谁来调用,都是普通函数,要传几个参数就要传几个参数
(@staticmethod)
给对象添加新的属性
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
调用类时触发,会将对象作为第一个参数,传给__ init __(),像此类的方法都是有特殊意义的,创建对象时要传除self以外所有的值
对象中属性的查找顺序:
1.对象。属性,会先找对象自己的
2.若对象中没有,会去找类的
3.若类中的没有,会去找父类的
什么是派生:
指的是子类继承父类的属性和方法,并且派生出自己独有的属性和方法,若子类与父类方法重名,先用子类的
子类继承父类,派生出自己的属性和方法,并且重用父类的属性和方法,有两种方法:
1.直接引用父类的__ init __ 方法,为其传参,并且添加子类的属性
父类名.__init__(self,相同的属性)
2.通过super()来指向父类的属性
super()是一个特殊类,调用super得到一个对象,该对象指向父类的名称空间
super().__init__(相同的属性) 不写self
使用哪一种都可以,但是不要两种混用
什么是新式类与经典类:
新式类:凡是继承了object的类或子孙类都是新式类, 在python3中所有的类都是默认继承新式类的
经典类:凡是没有继承object的类都是经典类,在python2中才有新式经典式之分
mro()是内置方法,用于查找新式类的顺序
多继承的情况下造成了钻石继承:
新式类:广度优先
经典类:深度优先
继承:继承时一种新建类的方式,新建的类是子类或派生类,继承的类是基类或超类,父类必须在子类的上方
继承的作用:减少代码的冗余
在python中,一个子类可以继承多个父类
但是在其他语言中,一个子类只能继承一个父类
***对象中添加属性,并不是修改类的属性
什么是组合?
组合指的是一个对象中包含另一个或多个对象,优点:减少代码的冗余
对比组合与继承:
继承是类与类之间的关系,是一种从属关系,组合是对象与对象之间的关系,是一种什么有什么的关系
什么是封装?
封装指的是将一堆属性与方法封装到对象中,好处是:通过对象.的方式可以存放或获取属性或方法,方便属性的获取
访问限制机制:
在类内部定义,以__ 开头的属性或方法,外部不可以直接访问,其实是将其变形为 _ 类名 __ 属性/方法
目的:将一些隐私的数据,隐藏起来,不让外部轻易获取
什么是property:
这是一个python的内置装饰器,可以装饰在‘类内部的方法’上,可以将方法的调用,由func+()变为func
为什么要使用property:
在某些应用场景下,调用的方法只是为了获取某个值,用名词来调用显得更加的合理
多态:指的是同一种事物不同的表现形式,目的:多态也称之为多态性,目的是为了在不知道对象具体类型的情况下,统一对象调用方法的规范
继承父类:
在python中不会强制限制子类必须要限制父类的规范,所以出现了抽象类
什么是抽象类:
作用:让子类必须遵循父类的编写规范
父类要继承adc模块中, meta class = adc.ABCMeta
在父类的方法中需要装饰上@abc.adstractmethod
在python中不推荐使用抽象类
父类中有几个抽象方法,子类中就得写几个
什么是鸭子类型:
不同的对象有相同的属性或技能
目的:不同的对象,先抽象出相同类型的方法,给他们定制一套统一的规范,所有的类,在定义时都要遵守统一的规范
多态的三种表现形式:
继承父类:
耦合度高,程序的可扩展性差,优点是减少了代码 的冗余
继承抽象类:
耦合度极高,程序的可扩展性极低,优点是在不知道对象的具体类型时,可以定制一套统一的规范
鸭子类型:
耦合度低,但是程序的可扩展性高,缺点是代码冗余
在python中推荐
简述classmethod与staticmethod
classmethod 与 staticmethod都是 python解释器内置的装饰器
classmethod:在类内部方法上修饰@classmethod,可以将类内部的方法变为类的绑定方法
staticmethod:静态方法,在类内部发法上修饰,@staticmethod,可以将类内部的方法变为非绑定方法
__ class __使用来查看当前对象的类
__ class __ . __ name __是用来查看当前对象的类名
uuid: 用来产生随机字符串的模块,会产生世界上独一无二的字符串
uuid.uuid4()
isinstance: 判断一个对象是否是另一个类的实例
issubclass:判断一个类是否是另一个类的子类
返回True或者False
什么是反射:
反射指的是通过字符串对对象的属性或方法进行操作
hasatrr:通过字符串判断对象的属性或方法是否存在
getattr:通过字符串来获取对象的属性方法
setattr:通过字符串来设置对象的属性或方法
delattr: 通过字符串来删除对象的属性和方法
凡是在类内部定义,以__ 开头,或者以 __ 结尾的方法,都是类的内置方法,又称之为魔法方法
__ new __ : 在 __ init __ 前触发,会产生一个新的对象
__ init __ : 在调用类时, 自动触发。通过产生的对象自动调用 __ init __
__ getattr__ : 在对象.属性时若属性没有时触发
__ getattribute __ :在对象.属性时,无论属性有没有都会触发
同时存在时,只会触发后者
__ setattr__ :在对象.属性 = 属性值时,触发
__ call__ : 在调用对象+()时触发
__ str__ : 在打印对象时触发,必须要有一个字符串的返回值
__ getitem__ :在对象通过“对象[key]”获取属性时触发
__ setitem__ :在对象通过“对象[key] = value值”来设置属性时触发
单例模式:
指的是在确定‘类中的属性和方法’不变时,需要反复调用该类,产生不同的对象,产生不同的空间,浪费资源
让所有的类在实例化时,指向同一个内存地址,称之为单例模式。
优点是:节省内存空间
第一种:用类的绑定方法来实现
class MYSQL:
__instance = None
@classmethod
def singleton(cls):
if not cls.__instance:
cls.__instance = cls()
return cls.__instance
第二种:重写__ new __ 来实现
class MYSQL:
__ instance = None
def __ new __(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = Object.__new__(cls)
return cls.__instance