一、面向对象由来
1 定义变量,定义函数,面向过程编程
2 定义一个来,类有属性(变量,特征),有方法(函数,技能)
二、面向对象编程和面向过程编程
1 面向过程编程(procedure oriented Programming)(POP)
面向过程编程的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么,然后再干什么
2 面向对象编程(object oriented programming)(OOP)
面向对象编程的核心是对象二字,对象时特征与技能的结合体
三、类和对象
# 造一个张三对象,他有体重身高,还有吃饭技能(特征与技能的结合体:属性和方法)
# 定义一个类 Person
class Person:
height = 180
weight = 70
# eat函数,就是方法特征
def eat(self):
print('吃饭技能')
# 定义对象(类的实例化,得到对象)
zhangsan = Person()
# 使用对象
print(zhangsan.height)
print(zhangsan.weight)
zhangsan.eat()
四、定制对象独有特征
class Student:
school = '清华'
def choose_course(self):
print('选课技能')
s1 = Student()
s1.name = 'alex' # 给对象s1定制独有特征姓名
五、对象属性查找顺序
class Student:
school = '某名牌大学'
def choose_course(self): # self必须写,哪个对象来调用我,self就是哪个对象
print(self.school)
print('选课技能')
# 定义了两个不同的新对象
s1 = Student()
s2 = Student()
# 下面打印出来都是 某名牌大学,因为s1对象和s2对象的名称空间中,都没有school属性,共用类的名称空间中的school属性
print(s1.school)
print(s2.school)
# s1这个人转学去了北大
s1.school = '北大'
print(s1.school) # 北大
print(s2.school) # 某名牌大学
print(Student.school) # 某名牌大学
# 对象自己有属性,优先用自己的,没有才用类的
# 先从对象自己的名称空间找,没有则去类中找,如果类也没有则报错
# 对象调用方法,使用的就是类中定义的方法
# 类中定义的方法,是绑定给对象的,对象来使用
# 哪个对象来调用方法,self就是哪个对象
s1.school = '北大'
s2.school = '清华'
s1.choose_course()
s2.choose_course()
# 对象属性的查找顺序:
# 对象自己--》类中---》报错
# 对象方法的查找顺序:
# 所有对象都用类的方法---》方法有self参数,通过self参数区分是哪个对象调用的
# 类名.__dict__ 类的名称空间
# 对象.__dict__ 对象的名称空间
# 所以类中的属性应该写对象共有的属性,如果是对象自己的,需要放到对象自己名称空间
s1 = Student()
s1.school='北大' # 改的是对象自己名称空间的属性,改不到类的属性
六、对象的绑定方法
# 函数:普通函数def定义的函数,有几个参数就要传几个参数
# 方法:绑定给某个对象的,方法有特殊之处:绑定给谁,就谁来调用,谁来调用就会自动把谁传过来,传给self
class Student:
def choose_course(self): # 定义在类内部的函数,就是绑定给对象的方法
# print(self.name) # 通过self来区分,到底是哪个对象调用了自己的绑定方法
print('%s这个人,选了课'%self.name)
s1=Student()
s1.name='Alex' # 自己名称空间加了name属性
s1.choose_course() # 绑定给对象的方法,对象来调用,自动把对象传进去
s2=Student()
s2.name='Jenny' # 自己名称空间加了name属性
s2.choose_course()
# print(Student.name) # 报错
# 类可以不可以调用方法?
# 可以调用,类来调用,就是个普通函数
s1=Student()
s1.name='李四'
Student.choose_course(s1)
# 类可以调用对象的绑定方法,但是需要手动把对象传进来,
# 现在choose_course就是个普通函数,有几个参数,就传几个参数
七、__init__方法
# 对象在实例化的时候,赋初值(给对象一些属性)
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def choose_course(self):
print('选课')
# 这种初始化方式会触发类的__init__的执行,并把参数传入
student=Student(name='lqz',age=19)
print(student.name)
alex=Student(name='egon',age=20)
print(alex.name)