python中一切皆为对象,类型的本质就是类!Python常用的数据结构如:List、tuple、dict、array、DataFrame或者Series等等都是类,类的实例就是对象。甚至连fp=open(’…/data/zhou.txt’)的句柄fp都可以作为(变量)对象传入函数。一切就是这么神奇!为了提高代码的复用性和更好的封装函数或变量的作用域,使用类再做一次封装会有用很多。
1.Python中self等价于Java中的this,this只是本类。
2.一个类占有一个独立的空间,类中的属性叫做类变量,类中的函数,叫做类的方法。类(Class):也可以成为类对象。类对象中包含了一批实例对象共有的属性和方法。
3.既然是面向对象,自然满足面向对象的几大特性:抽象、封装、继承、多态(很好的解决了应用程序函数同名问题)
4.面向过程和面向对象:
A.面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
a.优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
b.缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
c.应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
B.面向对象=对象+消息。
a.优点是:面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
b.缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题
注:个人理解,两者最大的差异是一个通过函数的流水线式直接交互;一个封装成类后,通过类的实例=对象,按照对象.属性或对象.方法来实现交互!实现同一功能时,本质上异曲同工。
例子1:super()继承的使用
Python面向对象编程
# 创建父类学校成员SchoolMember
class SchoolMember:
def __init__(self,name,age):
self.name=name
self.age=age
def tell(self):
print('Name:"{}",Age:"{}"'.format(self.name,self.age),end=" ")
class Teacher(SchoolMember): #python中的继承机制,这里可以是多继承;java中只能是单继承,但是可以迭代继承多个嵌套封装类
def __init__(self,name,age,salary):
SchoolMember.__init__(self,name,age)
self.salary=salary
def tell(self):
SchoolMember.tell(self)
print('salary:"{}"'.format(self.salary))
class Student(SchoolMember):
def __init__(self,name,age,score):
#SchoolMember.__init__(self, name, age)#这里与super()是等价的。
super().__init__(name, age)
self.score=score
def tell(self):
#SchoolMember.tell(self)
super().tell()
print('score: {}'.format(self.score))
teacher1 = Teacher("John", 44, "$60000")
student1 = Student("Mary", 12, 99)
teacher1.tell() # 打印 Name:"John" Age:"44" Salary: $60000
student1.tell() # Name:"Mary" Age:"12" score: 99
例子2:面向对象中对象的交互操作
#面向对象中对象的交互操作:
class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人
def __init__(self, name, aggressivity, life_value):
self.name = name # 每一个角色都有自己的昵称;
self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
self.life_value = life_value # 每一个角色都有自己的生命值;
def attack(self,dog):
# 人可以攻击狗,这里的狗也是一个对象。
# 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
dog.life_value -= self.aggressivity
print(dog.__class__,dog.name,'生命值减少',self.aggressivity,'还剩余生命值: ',dog.life_value)
egg = Person('egon',10,1000)
print(egg.name)
print(egg.aggressivity)
print(egg.life_value)
print(egg.attack)
class Dog: # 定义一个狗类
role = 'dog' #