Python之初识面向对象
1、面向过程的编程思想:
流水线式的编程思想,在设计程序时,需要把整个流程设计出来
优点:
1:体系结构更加清晰,2:简化程序的复杂度
缺点:
1:可扩展性极其的差,所以说面向过程的应用场景是:不需要经常变化的软件,如:linux内核,httpd,git等软件
2、面向对象的编程思想
优点:解决了程序的扩展性。对一个对象单独修改,会立刻反应到整个体系中,如对游戏中的一个人物参数的特征和技能修改都很容易
缺点:
可控性差,复杂度高,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霾的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层。互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方
3、什么是对象?什么是类?
基于面向对象设计的一款游戏:LOL,每个玩家选一个英雄,每个英雄都有自己的特征和技能,特征即数据属性,技能即方法属性,特征与技能的结合体就是一个对象
从一组对象中提取相似部分的就是类,类是所有对象都具有的特征和技能的结合体
类的功能:
class Person: contury= 'CN' # 数据属性是所有对象共享的,类自身也能调用,对象的__dict__内部并没有这个属性,只不过找不到会来这里找 def __init__(self,name,sex): # 实例化的时候先执行 self.name=name self.sex=sex def walk(self): # 函数属性是绑定给对象使用的,每个对象的函数属性内存地址都不一样 print('person is walking') hjc = Person('hjc',18) #实例化:类名(参数1,参数2) 类名()就等于在执行Person.__init__() print(hjc.name) #直接查看属性 对象名.属性名 print(hjc) #返回的是一个对象 hjc.walk() #调用方法 ,对象名.方法() print(hjc.__dict__) 并没有 country 这个属性 print(hjc.country) 但是可以打印出来,会到 Person 类里面找 hjc.country='EN' # 这里是 hjc 自己造了一个 country 属性,并不是修改 类里面的,再也用不到类里面的,除非 del 自己的,对于不可变数据类型来说,类变量最好用类名来操作 obj.name 会先从 obj 自己的 __dict__ 名称空间查找,没有则去类里面找,找不到就去父类找,最后没有就抛异常 强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理) hjc1.learn() #等同于Person.walk(hjc1) hjc2.learn() #等同于Person.walk(hjc2) hjc3.learn() #等同于Person.walk(hjc3) Person.walk(hjc1) # 等同于普通函数的执行,遵循普通函数的规则,需要给参数就给参数
class Person: contury= 'CN' #类属性----静态属性,数据属性 def walk(self): #这里的函数叫做方法-----动态属性,函数属性 #注意:self必须写 print('person is walking ...') print(Person.contury) #查看类属性 print(Person.walk) #查看类方法 , 用类名去调用方法名,打印出来的是内存地址
4、什么时候用面向对象?
非常明显的处理一类事物,这些事物都具有相似的属性和功能
当有几个函数 需要反反复复传入相同的参数的时候,就可以考虑面向对象
这些参数都是对象的属性
5、什么是self ?
对象在实例化时会自动将对象/实例本身传给__init__的第一个参数,首先触发 __init__的执行
self 有什么用:类里面的方法和属性要间接调用就要通过对象
注意:def __init__(self): 这句话可以写也可以不写,只要有参数参进来的时候就必须得写
def 方法名(self):这里的self必须得写
6、类的特殊属性
print(Person.__dict__) #查看类的名称空间都有什么,字典包含属性和方法 print(Person.__name__,type(Person.__name__)) #查看类的名字(这里的类名是字符串类型的) print(Person.__doc__)# 就是把注释显示出来,描述信息 print(dir(Person)) #查看类的方法,以列表的形式显示出来 print(Person.__module__) #类定义所在的模块,本文件是 __main__ print(Person.__class__) # 类的类型 print(isinstance(hjc,Person))#判断对象 是否是类的实例
7、类属性的增删改查
#查 print(Person.country) #Person.__dict__['country'] print(Person.walk) #Person.__dict__['walk'] #增 Person.county='China' print(Person.__dict__) print(Person.county) #删 del Person.county #改 Person.country='CHINA'
8、对象属性的增删改查
stu1 = Person('hjc', 'man') # 改 stu1.name = 'jc' print(stu1.__dict__) # {'name': 'jc', 'sex': 'man'} # 删 del stu1.name print(stu1.__dict__) # {'sex': 'man'} # 增 stu1.class_name = 'python' print(stu1.__dict__) # {'sex': 'man', 'class_name': 'python'}
9、类的属性与对象的属性
类的属性是静态属性,类在加载的时候这个属性就被分配内存了,所有对象实例化的时候都会共享这个类的属性
对象的属性属于对象自己的,属性值都不同,占用多份内存
举例:类的属性相当于班级名,对象的属性相当于学生名