面对对象基础
初识面向对象:
面向过程:
优点:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可
缺点:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身
应用场景:一旦完成基本很少改变的场景。例Linux内核,Git以及apcaApache HTTPserserver等
面向对象:
优点:解决了程序的可扩展性,对某一个对象单独修改,会立刻反映到整个体系中,例:对游戏中一个人物参数的特征和技能修改都很容易
缺点:可控性差(结果预测性差),无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果。
函数与面向对象:
1.函数封装一个功能,而面向对象封装多个相关的功能
2.面对对象比较抽象,它是一种思想,需要站在上帝的角度去理解
3.程序可扩展性,对象都是一个个独立的,耦合性,差异性
类 :指具有相同属性或者功能的一类实物(例人类,爬行类)
对象:是类的具体体现
结构上理解:面对对象:俩部分
class A: #定义一个类 name = 'alex' # 静态属性,静态变量,静态字段。 def func1(self): # 函数,动态属性,方法。 pass
类的俩种作用:属性引用和实例化
属性引用:
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
类名:
1.__dict__ 作用:查看类中的所有所有属性和方法,不可以进行增删改
class Person: animal = '高级动物' def work(self): print('人类都需要工作。。。') print(Person.__dict__) #类中的属性 print(Person.__dict__["animal"]) #通过__dict__方式 单独的属性及方法可以查,但是不能增删改
2.查看,(增删改)类中某个,某些属性 用万能的点
print(Person.animal) # 查 # print(Person.language) # Person.name = 'alex' # 增 # print(Person.name) # Person.animal = '低级动物' # 改 # del Person.walk_way # 删 # print(Person.__dict__)
注意:可以通过Person.__dict__["work"](1)来执行类中的动态属性(方法),但是不建议这么做
实例化:类 名后加上括号,就会触发__init__(一种特殊函数)函数的运行,可以用它来为每个实例定制自己的特征
实例化过程内部经历三个阶段:
1.在类名后加上一个括号Person(“alex”,"man"),就会在内存中开辟一个对象空间
2.自动执行类中__init__方法,并且将对象空间自动传给self参数,其他参数(“alex”,"man")手动传入
3.执行__init__方法,给对象空间封装相应的属性
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def __init__(self,name,sex): self.name = name # 每一个角色都有自己的昵称; self.sex = sex #每个人都有自己的性别 def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") egg = Person("alex","man") #具体实例化,创建具体的一个人物 print(egg.name) #查看对象的名字 print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
对象:
对象操作对象空间:
对象参看对象空间的所有属性 用__dict__
对象操作对象的某个属性 用万能的点进行增改 使用del 进行删除属性
对象操作类空间的属性:只能进行查
对象操作类空间的方法(动态属性)
class Person: animal = '高级动物' def __init__(self,name,sex): self.name = name self.sex = sex def work(self): print('人类都需要工作。。。') obj = Person("alex","man") print(obj.__dict__) #查对象空间的属性 obj.name = "taibai" #对象空间属性的改 obj.hobby = "打球" #对象空间属性的增 del obj.sex #将对象空间的sex属性删除 print(obj.animal) #对象空间查看类空间中的属性 obj.work() #对象操作类空间的方法
类名称空间与对象名称空间
1.对象空间为什么能调用类中的属性与方法,只能调用不能改变
对象空间先从自己空间中找属性,对象空间没有此属性就会通过类对象指针从类中去找,如果类中找不到,会从父类中去找。
对象只能查看类中的属性,不能对类中的属性进行增删改。
2.类不能调用对象的属性。
3.对象与对象之间不可以互相调用。
同一类实例化出来的对象之间是不能互相访问的。但是不同类实例化的对象是有可能进行互相访问的
4.给对象封装属性:__init__ 任意位置