简单说,不论面向对象,还是面向过程,没有必然的好坏之分。就像是“功夫本没有高低之分,只是练功夫的人有强弱之别”一样。
面向过程:讲究步步为营,流程化和需求的分解是关键。
面向对象:上帝思维,所有的问题,都通过“对象”来解决。像是一个知人善任的帝王。
重点介绍一下面向对象的优点:解决了面向过程中的扩展性低的情况。
所以,面向对象的缺点就很明显了,就是复杂!这里的复杂并不是代码的实现,而是对于需求分析中的各类之间的关系,以及应该如何去关联。
首先,需要认清的一点,在现实生活中,是先有对象,才开始有了”类“这个概念,所以类是后来才有的,是抽象的。
但是,在计算机的世界里,必须是先有类才能产生对象,因为计算机并不知道你后面要写什么。所以,通过类产生对象,先有超类才有子类都是这样的道理。
(先定义类,再调用类。)


class Galen: country=De_Marcia def __init__(self,name,hp,ad) self.name=name self.hp=hp self.ad=ad def attrack(self): pass
到这里,就可以分析一下在定义类的时候,运行的过程了:
1.定义类名后,开辟了一块内存空间。
2.定义了静态属性
3.定义__init__方法
4.定义了函数
5.将内存地址给Galen
类的静态属性增删改查


增加: galen.type=tanke 删除: del galen.type 改: galen.country="china" 查: galen.country
在这里,着重要说一点::这里可以用__dict__()方法,但是,这种方法在这里只能看,不能改,也不能删!!!


print(galen.country)
然后,就是实例化的过程了。


g1=Gaglen("super") g2=Gaglen("men") g3=Gaglen("super_man") 实例化后的对象都用到了__init__()
这里也解释一下。
在执行到__initi__的时候,就会开辟一个内存空间。这个内存空间的地址就给了self,在实例化后,就会将self的地址又给到对象。而这块空间中的变量都是可以用self.变量名,进行赋值的。这块内存中还有类对象指针,这指针又指向了在定义类的时候开辟的空间,这样就打通了这两块内存。
接下来,就来看看这块开辟的__init__内存空间的增删改查


增加: g1.level=1 删除: del g1.level 修改: g1.name=666 修改方法2: g1.__dict__["name"]=666 查询: g1.name g1.__dict__
趁热打铁,就再说一说,因为前面说过,在__init__中有类对象指针,这就单项的指向了定义类的时候开辟的内存,这就会产生下面的操作
print(g1.country)
这样的调用是成功的,就是说,对象可以调用类的静态属性。
但是,重点是:对象是不能修改类的静态属性的。或者是说如果对象修改了类的静态变量,其实只是在自己的空间中添加了修改的静态变量,而静态变量的值就是你自己改的值,所以,说白了,其实不是在修改类的静态变量,而是在自己的空间内新建了一个变量。而类的其他实例化对象在调用类的静态变量的时候,还是原来的值。
在说这里的一个点,这里的说的不变其实就是说类定义是开辟的内存中的静态变量地址不变,但是如果这里的静态变量是一个可变的数据类型的时候,其实这个列表的内存是不变的,但是其中的元素的内存地址改变,或者说,改变可变数据类型的元素是可以的~!
类中的方法,类是自己可以调用的。类·方法 就可以了!
类中定义的函数就是绑定给对象的,绑定不同的对象,就用不同的绑定方法。
到这里,就可以说一句,python3中,类就是类型,数据类型!!
所以,发挥你的想象力,python一切皆对象!!
lst1=list() lst2=list() lst3=list() 每个对象都有append的方法,但是,内存地址是不同的! lst1.append(1) 这样操作后,在lst1中有1,但是,lst2和lst3中都是没有的。
试想一下,在远古时期,只有面向过程,但是没有面向对象。一旦需要什么数据的时候,都是需要输入的,解决的办法就是定义成全局变量,然后在引用,或者如果数据量不是特别的巨大,还可以考虑用到闭包。
但是有了类以后,就可以通过类可以将数据和操作绑定到了一起。而且扩展性高,分成不同的类后,然后修改一个类的属性后,就可以影响或改变其他的类。效用很高!