代码笔记:
'''
面向过程和面向对象的区别:
(1)面向过程:当需要实现某一功能时,注重实现的过程,分析出每一个步骤如何去实现并定义相应的函数,然后调用函数。
(2)面向对象:当需要实现某一功能时,注重的是找某个对象去实现。
类(class):是对一系列具有相同属性和行为事物的统称。是一个抽象的概念,是不真是存在的事物。
注意:类命名时遵循大驼峰命名法,见名知意。
基本格式:
class 类名:
代码块
对象(object):是类的具体表现。
实例化(创建)对象的格式:
对象名 = 类名()
类的三要素:
1.类名
2.属性:对象的特征描述
3.方法:对象具有的功能(行为),用来说明能够做什么。
'''
class Fish: # 创建Fish类,声明height属性
height = 30
print(Fish.height) # 查看类属性格式:类名.属性名
Fish.weight = 40 # 新增类属性:类名.属性名 = 值
print(Fish.weight)
fs = Fish() # 实例化一个对象
print(fs)
'''
实例方法:由对象调用,至少有一个self参数;执行实例方法的时候,自动将调用该方法的对象赋值给self。
'''
class Person:
height = 170 # 类属性height
weight = 60 # 类属性weight
def run(self): # self参数是类中实例方法必须具备的
print('人类会跑步')
print(f'方法中的self:{self}') # self参数代表调用该方法的实例对象
man = Person()
man.run()
'''
实例属性基本格式:self.属性名
类属性与实例属性的区别:
类属性:是属于类的属性,是公共的,所有实例对象都可以访问。
实例属性:是属于实例对象的,是私有的,只能由对象名访问,不能由类名访问。
'''
class Vehicle:
speed = 90
def speed_up(self):
print('汽车当前速度为:', self.speed, 'km/h') # self.speed为类属性
print('加速后的速度为:', self.current_speed, 'km/h') # self.current_speed实例属性
print('最后的速度为:',self.final_speed, 'km/h')
v1 = Vehicle()
v1.current_speed = 120 # 添加实例属性
v1.final_speed = 30 # 添加实例属性
print(v1.final_speed) # 根据对象名访问实例属性
print(v1.speed) # 根据对象名访问类属性
v1.speed_up()
'''
构造函数(方法):__init__()
作用:通常用来做属性初始化或者赋值操作;
注意:在类实例化对象的时候会被调用。
析构函数(方法):__del__()
作用:用于对象的回收和销毁操作。
注意:在删除对象的时候,解释器会默认调用__del__()方法。
'''
class Cup:
def __init__(self, owner, use, price): # 构造函数
self.owner = owner # 实例属性:杯子主人
self.use = use # 实例属性:杯子用途
self.price = price # 实例属性:杯子价格
def display(self):
print(f'这是{self.owner}的{self.use}杯,花费{self.price}元购买。')
cp = Cup('小明', '咖啡', 20)
cp.display()
cp1 = Cup('小华', '喝茶', 18)
cp1.display()
'''
面向对象的三大特性:封装、继承、多态。
封装:将复杂的信息、流程封装起来,让使用者只需要通过简单的步骤,就能实现某个功能。
作用:隐藏对象中一些不希望被外部访问到的属性或方法。
私有属性:声明私有属性或方法;在类中定义后,外部实例对象可以访问,也可以被子类继承,但无法被其他.py文件导入。
格式:在属性或者方法前加上1个下划线 _属性名(方法名)
用途:为了避免与关键字命名冲突而采用的命名方式。
隐藏属性:只允许在类的内部使用,无法通过对象直接访问,只能间接访问;子类不会继承,也无法被其他.py文件导入。
格式:在属性或者方法前加上2个下划线 __属性名(方法名)
用途:一般用于Python的魔术方法或属性,都是有特色含义或功能的,不建议轻易使用。
'''
class Student:
name = '张三' # 普通属性
__score = 88 # 隐藏属性
_course = 'Python程序设计' # 私有属性
def display(self):
print(f'{self.name}的{self._course}成绩是{self.__score}分。')
self.__location() # 间接访问隐藏方法
def __location(self): # 隐藏方法
print('考试座位在1101教室的32号座位')
def _behave(self): # 私有方法
print('考试行为正常')
s = Student()
print(s._course)
print(s.name)
# print(s._Student__score) # 可以通过 “ _类名__属性名 ” 方式直接访问隐藏属性。
s.display() # 在类的内部访问隐藏变量
s._behave() # 访问私有方法
'''
面向对象的三大特性:封装、继承、多态。
继承:将类分为子类和父类,子类默认继承父类的属性和方法。
格式:class 子类名(父类名):
分类:单继承和多继承
'''
# 单继承
class HumanBeing: # 父类
def walk(self):
print('我会走路')
def run(self):
print('我会跑')
class Man(HumanBeing): # 子类1
pass # 占位符,当一个类不写任何代码时,通过保持缩进来保证程序正常执行。
class Woman(HumanBeing): # 子类2
pass
man = Man()
man.walk()
man.run()
woman = Woman()
woman.walk()
woman.run()
'''
继承的传递(多重继承):A类(子类1)继承B类(父类1),B类(父类1)继承C类(父类2)。A同时具有B类和C类的属性和方法。
'''
class Teacher: # 父类2
def teach(self):
print('上课')
class Lecturer(Teacher): # 父类1
def check(self):
print('批改试卷')
class Professor(Lecturer): # 子类
def survey(self):
print('做研究')
professor = Professor()
professor.check()
professor.teach()
professor.survey()
'''
方法重写:在子类中定义与父类相同名称的方法
(1)覆盖父类的方法:在子类中重写一个与父类同名的方法,子类调用时优先调用重写后的方法。
(2)对父类方法进行扩展:在子类方法中调用父类的方法。有两种形式:
1.父类名.方法名(self)
2.super().方法名() 【推荐使用】不需要参数
3.super(子类名,self).方法名()
'''
class A: # 父类
def eat(self):
print('吃米饭')
def sleep(self):
print('睡觉')
def run(self):
print('跑步')
class B(A): # 子类
def eat(self): # 重写方法eat
A.eat(self) # 通过【父类名.方法名(self)】的方式对方法进行扩展
super().sleep() # 通过【super().方法名()】的方式对方法进行扩展
super(B, self).run() # 通过【super(子类名,self).方法名()】的方式对方法进行扩展
print('吃面')
b = B()
b.eat()
运行结果:
30
40
<__main__.Fish object at 0x000001EBA546B100>
人类会跑步
方法中的self:<__main__.Person object at 0x000001EBA544F190>
30
90
汽车当前速度为: 90 km/h
加速后的速度为: 120 km/h
最后的速度为: 30 km/h
这是小明的咖啡杯,花费20元购买。
这是小华的喝茶杯,花费18元购买。
Python程序设计
张三
张三的Python程序设计成绩是88分。
考试座位在1101教室的32号座位
考试行为正常
我会走路
我会跑
我会走路
我会跑
批改试卷
上课
做研究
吃米饭
睡觉
跑步
吃面
Process finished with exit code 0