一、面向对象的定义
说到面向对象,我们先来看一下面向过程的定义:面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。优点:降低了程序的复杂度,使得程序的运行过程变得直观明了。缺点:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。
面向对象的定义:面向对象的程序设计的核心是对象,万物皆对象。优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
二、类和对象
类是一个抽象的概念,是把一类事物的想的特征和动作整合到一起。对象是基于类而创建出来的一个个具体的‘对象‘,也是特征和动作整合到一块。必须牢记类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
三、定义类
在Python中,定义类是通过class
关键字:
class Student(object): #类名首字母要大写,object为继承对象 pass
>>> bart = Student() #创建创建出Student
的实例
>>> bart
<__main__.Student object at 0x0000000002F12EB8> #变量bart
指向的就是一个Student
的实例,后面的0x10a67a590
是实例的内存地址
>>> Student
<class ‘__main__.Student‘>
下面来看一个具体的例子:
class Student(object): ability = ‘优秀‘ def __init__(self, name, score): self.name = name self.score = score def ask_questions(self): print(‘{0}正在问数学问题‘.format(self.name)) def examination(self): print(‘{0}考试的成绩为{1}‘.format(self.name,self.score)) student1 = Student(‘XiaoMing‘,90,) #类的实例化 print(student1.__dict__) #查看实例属性 print(Student.__dict__) #查看类属性 student1.ask_questions() #实例调用类的函数属性,实例没有函数属性,只能调用类的函数属性 print(student1.ability) #访问类的数据属性
1.类的函数属性中所传入的self其实就是实例本身(student1)
2.实例调用的是类的函数属性,实例没有函数属性,只能调用类的函数属性
3.实例在调用数据属性的时候如果在__init__里找不到,那么就会向上一层找,再找不到就不报错
类属性的增删改查
class Student(object): ability = ‘优秀‘ def __init__(self, name, score): self.name = name self.score = score def ask_questions(self): print(‘{0}正在问数学问题‘.format(self.name)) def examination(self): print(‘{0}考试的成绩为{1}‘.format(self.name,self.score)) student1 = Student(‘XiaoMing‘,90,) #类实例的实例化 print(Student.ability) #查看 Student.ability = ‘良好‘ #修改 print(Student.ability) Student.sport = ‘basketball‘ #增加 print(Student.sport) print(Student.__dict__) #查看属性字典中是否增加了sport这一项 del Student.sport #删除 print(Student.__dict__) #查看属性字典中是否删除了sport这一项 print(Student.sport) #AttributeError: type object ‘Student‘ has no attribute ‘sport‘
实例属性的增删改查
class Student(object): ability = ‘优秀‘ L = [‘a‘,‘b‘] def __init__(self, name, score): self.name = name self.score = score def ask_questions(self): print(‘{0}正在问数学问题‘.format(self.name)) def examination(self): print(‘{0}考试的成绩为{1}‘.format(self.name,self.score)) student1 = Student(‘XiaoMing‘,90,) #类实例的实例化 print(student1.ability) #查看 student1.name = ‘XiaoHua‘ #修改 print(student1.name) student1.sport = ‘basketball‘ #增加 print(student1.sport) print(student1.__dict__) #查看属性字典中是否增加了sport这一项 del student1.sport #删除 print(student1.__dict__) #查看属性字典中是否删除了sport这一项 #输出: 优秀 XiaoHua basketball {‘name‘: ‘XiaoHua‘, ‘score‘: 90, ‘sport‘: ‘basketball‘} {‘name‘: ‘XiaoHua‘, ‘score‘: 90}
补充:
在上面调用student1.L.append(‘c‘),此时改的是类的L,因为实例student1中根本没有这个属性。
但是如果是student.L = [‘q‘,‘w‘,‘e‘] 此时相当于新增了一个实例的L属性列表,对类的数据属性中的L并不会产生任何影响
注意:新增属性是通过赋值操作来完成的。