目录
1. 面向对象由来
1.面向过程编程:定义变量,定义函数
优点:复杂的问题流程化,进而简单化
缺点:牵一发而动全身,扩展性差,可维护性差
应用场景:对扩展性要求不高的地方
2.面向对象编程:定义一个类,类有属性(变量、特征),有方法(函数,技能)
优点:扩展性强,可维护性强
缺点:编程复杂度高
应用场景:对扩展性要求较高的地方
2. 面向对象编程
1 面向过程变成的核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么
2 面向对象编程的核心是对象二字,对象是特征与技能的结合体,盛放数据和函数的容器
3. 类和对象
# 必须先定义类,然后调用类产生对象
# 定义了类 Person
class Person(): # 类名首字母一般情况大写,使用大驼峰法命名
# 定义属性
weight = 90
height = 180
# 定义技能(函数)
def sleep1(self):
print('睡觉')
'''
定义类:
1. 立即执行类体代码
2. 产生一个类的名称空间,把类体里面执行的名字都扔到名称空间中(大字典)
3. 把类的名称空间绑定给__dict__, 类名.__dict__
'''
# 查看类的名称空间
print(Person.__dict__)
# 调用类产生对象,默认产生的就是一个空对象{}
zhangsan = Person() # 类的实例化,得到对象
# 使用对象
zhangsan.sleep1() # 睡觉
print(zhangsan.height) # 180
4. 定制对象独有特征
class Person():
weight = 90
height = 180
def sleep1(self):
print('睡觉')
zhangsan = Person()
zhangsan.city = 'BJ' # 给shangsan对象定制独有的特征
print(zhangsan.city) # BJ
5. __init__
方法
# 对象在实例化的时候,赋初值(给对象一些属性)
# 老方法
class Student():
def choose_course(self):
print('选课')
s1 = Student()
s1.name = 'json'
s1.age = 18
print(s1.name) # json
# __init__的使用
class Student():
def __init__(self, name, age):
self.name = name
self.age = age
def choose_course(self):
print('选课')
s1 = Student('tom', 18) # 这种初始化方式会触发类的__init__的执行,并把参数传入
print(s1.name)
6. 属性的查找顺序
# 属性的查找:先从自己的对象中查找,然后在去产生对象的类中取找
class Student():
school = 'Harvard University'
def __init__(self, name, age, gender, course=None):
if course is None:
course = []
self.name = name
self.age = age
self.gender = gender
self.course = course
def choose_course(self, course):
self.course.append(course)
print('%s 选课成功 %s ' % (self.name, self.course))
s1 = Student('bob', 18, 'male')
print(s1.__dict__) # {'name': 'bob', 'age': 18, 'gender': 'male', 'course': []}
s1.choose_course('python') # bob 选课成功 ['python']
print(s1.__dict__) # {'name': 'bob', 'age': 18, 'gender': 'male', 'course': ['python']}
'''
属性的查找:
1. 类属性: 在类中写的属性就称为类属性
2. 对象属性:在对象自己的名称空间中的属性就是对象属性
'''
# 1.类属性的查找
# 查
print(Student.school)
# 增
Student.country = 'USA' # 后面实例化的新对象才会有
print(Student.country)
# 删
del Student.school
print(Student.__dict__) # 删除了school属性
# 改
Student.school = 'Oxford'
print(Student.school) # Oxford
# 2.对象的属性查找
# 查
print(s1.name) # bob
# 增
s1.height = 180
print(s1.__dict__) # 多了height
# 删
del s1.age
print(s1.__dict__) # age 没有了
# 改
s1.name = 'tony'
print(s1.name) # tony
# 判断对象是否是某个类实例化的
class Teacher():
pass
print(isinstance(s1, Student)) # True
print(isinstance(s1, Teacher)) # False