Day 19 类与对象/查找顺序/对象的绑定方法
目录
面向对象编程
面向过程编程
面向过程编程的核心是‘’过程‘’二字,过程是指解决问题的步骤,即先干什么再干什么,然后干什么
基于面向过程编程的思想编写程序就好比一条流水线,是一种机械式的思维方式
- 优点:复杂的问题流程化,进而简单化
- 缺点:可扩展性差
面向对象编程
面向对象编程的核心是‘’对象‘’,对象是特征与技能的结合体
基于面向对象编程的思想编写程序就好比创造了一个世界
- 优点:可扩展性强
- 缺点:编程的复杂程度要高于面向过程
类和对象
什么是对象
对象是特征和技能的结合体
什么是类
类的意思就是:种类,分类,类别
类就是一系列对象相似的特征与技能的结合体
在python程序中,必须先定义类,然后再调用类产生对象
现实世界中定义类和对象
就拿现实世界中的猫来讲,我们可以将一只猫视为一个对象
定义对象
猫1:
特征:
品种:英短
年龄:5岁
体重:5kg
爱好:吃肉
技能:
吃
睡
猫2:
特征:
品种:加菲猫
年龄:6岁
体重:6kg
爱好:吃肉
技能:
吃
睡
定义类
所以我们可以把总结为猫类
动物类:
相似的特征:
爱好:吃肉
相似的技能:
吃
睡
程序中定义类和对象
定义类
class Cat():
hobby = 'meat'
def eat():
print('eat meat')
def sleep():
print('sleeping')
定义类的时候,会生成类的名称空间,并执行类内部的代码,将类里面的名字放到名称空间里
定义对象
调用类即可产生对象,调用类的过程,又被称为类的实例化,实例化的结果称为类的对象
cat1 = cat()
print(cat1.hobby)
meat
cat2 = cat()
cat2.eat()
eat meat
定制对象独有特征
class Student():
school = 'oldbly'
def choose_course(self):
print('choosing_course')
stu1 = student()
stu2 = student()
- 对于上述的学生类,类中的属性发生改变,那么他所实例化的对象的属性也会发生变化
student.school = 'oldgirl'
print(stu1.school)
print(stu2.school)
oldgirl
oldgirl
我们说类是相似的对象特征和技能的结合体,那么每一个对象还具有一些独有特征
对象本质类似于类,也是一个名称空间,但是对象的名称空间用来存放对象独有的名字
两种方法定制对象独有特征:
方式一:
stu1.name = 'Tiny'
stu2.name = 'Nick'
方式二:
# 使用类的__init__方法,实例化对象的时候自动触发定制属性
class Student():
school = 'oldbly'
def __init__(self, name):
self.name = name
def choose_course(self):
print('choosing_course')
stu1 = Student()
stu2 = Student()
对象的绑定方法
类内部的函数主要是给对象用的:
- 由类来调用类内部的函数,该函数只是一个普通的函数,普通函数需要接收几个参数就得传入几个参数。
- 由对象来调用称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同的对象传入该绑定方法中
对象的绑定方法,是由对象来调用的,特殊之处就是把对象当做第一个参数传入该方法中
class Student():
school = 'oldbly'
def __init__(self, name):
self.name = name
def choose_course(self):
print('choosing_course')
stu1 = Student()
print(Student.choose_course)
print(stu1.choose_course)
<function Student.choose_course at 0x006F0FA8>
<bound method Student.choose_course of <__main__.Student object at 0x006F71B0>>
对象与类的查找顺序
- 对象.属性,若对象本身有,则优先查找对象自己的
- 若对象本身没有,则去类里找,若类也没有,则报错
class Student():
SCHOOL = 'oldboy'
NAME = 'DDDDDDDD'
def __init__(self, name, age, sex, school):
self.name = name
self.age = age
self.sex = sex
self.SCHOOL = school
stu1 = OldboyStudent('小正正', 17, 'male', 'oldgirl')
print(stu1.SCHOOL)
print(stu1.NAME)
oldgirl
DDDDDDDD
print(stu1.AGE) # 报错
python中一切皆对象
int, float, str, list, tuple, dict, set, bool也是对象
python中一切都是对象
list1 = [1, 2, 3] # list([1, 2, 3])
print(list1) # [1, 2, 3]
print(id(list1)) # 2738050243464
print(type(list1)) # <class 'list'>