三大编程范式:编程方法论
面向过程、函数式编程、面向对象 (没有最强的方法,只有最强的人)
函数式编程是数学意义的函数,参数是函数或者返回是函数,没有变量的赋值,循环用递归实现,并不是用函数来编程的意思
编程进化,流程化编程---(不好维护,复杂,无组织无结构)---重复的功能逻辑组织起来,形成结构化---属性数据和动作集合在一起的对象,描述一个对象的编程就是面向对象,面向对象是封装了对象私有的属性和动作,绑定成对象或者类
所有的事物都可以用属性和动作来描述
并不是只有类才是面向对象,函数也可以是面向对象,利用嵌套函数实现
类:把一类事物的相同特征和动作整合到一起就是类,类是一个抽象的概念,类也是一种数据结构,结构化的
对象:就是基于类而创建的一个具体的事物,是具体存在的,也是特征和动作整合到一起,这个叫面向对象设计
面向对象编程:OOP (object -oriented programming)用定义类+实例对象的方式去实现面向对象设计
类:
实例化一个类的时候要加()
经典类 class 名: 新式类 calss 名(名):有继承 在Python3中都是新式类
类的属性包含两种:数据属性就是变量 函数属性就是面向对象里称为方法, 都通过点.来访问,其实通过点来查找属性就是通过 属性字典里来查找那个功能,这个点相当于 类.__dict__['属性名']() 调用的属性字典的内容
类.__dict__ 是类的属性字典 dir只是放类的名字 dict则对应详细的字典内容
对象:
class sth: def __init__(self,name,age): self.name=name self.age=age s1=sth('alex','18') print(s1.name)
self就是实例的自己,init是初始化函数,会自动取参数,并返回的字典,self.name其实是在找字典中的键,当实例化的时候实际上是找字典键值,见下图
class sth: def __init__(self,name,age): self.name=name self.age=age s1=sth('alex','18') print(s1.__dict__)
结果是
{'name': 'alex', 'age': '18'} #实际上看到的是一个字典的数据结构,只是类的这种数据类型会自动专门处理返回值并不需要添加return
当在__init__作用域中找不到的功能,那么就会向外一层来找,所以实例化的调用是在全类作用域中找属性和方法。函数属性是属于类的作用域,所以实例只有数据属性
类的字典是比实例的范围大的,包括了类的方法,所以,类中的方法都要加self,把实例名字当参数传入之中,所以实例加点也可调用到类中的函数方法,只要函数方法中加self参数。深层次思考,实例化的时候只是初始化并没绑定函数方法,但是只有用到方法的时候才会调用进来,这样节省内存,并不需要全都加载进来。类的设计就是实例调用方法就是调用类的方法。
其实第一个参数是类自动传的,可以起别的名字,调用类的功能自动把自己传入第一个参数
类中所有函数的第一个参数一定是self,类命名为驼峰命名
类的增删改查 删del
实例的增删改查 不影响类的属性,他在用自己的作用域 ,如果定义变量的时候没加self 那么在他其中的赋值 是不在自己的作用域内的,是整个函数的变量
a=12 class sth: a=14 def __init__(self,name,age): self.name=name self.age=age print(a) #这里的a并不是类里的变量,因为没加self格式,如果没有会报错,调用的时候没用 点. 来引用就和类没关系 s1=sth('alex','18') print(sth.a) 12 14
实例中的操作一定是用赋值完成的,列表append等方法在实例中没有赋值完的情况下,只能是对类的属性产生作用,并不能在实例中加入变量
class sth: a=[14] def __init__(self,name,age): self.name=name self.age=age s1=sth('alex','18') # s1.a=['a','b'] s1.a.append('c') print(s1.__dict__) print(sth.__dict__)