Day17笔记
面向对象编程
Object-oriented programing
对象的意义 |
对象是指现实中的物体或实体 |
面向对象的意义 |
把一切看成对象(实例),用各种对象之间的关系来描述事务 |
对象的特征 |
1.对象有很多属性(名词) 姓名,性别,年龄,… |
2.对象有很多行为(动作,动词) 学习,吃饭,睡觉,工作,…. |
|
示意 |
车(类)----àBYD e6 (京A.88888) (实例,对象) \ \----àBWM x5 (京B.6666) (对象) |
狗(类)---à 京巴 (户籍号:000001) \ \----à 导盲犬 (户籍号:000002) |
类
意义 |
1.拥有相同属性和行为的对象分为一组,即为一个类 |
|
2.类是用来描述对象的工具,用类可以创建此类的对象(实例) |
||
类的创建语句: Class语句 |
语法 |
作用 |
Class 类名(继承列表) 实例方法定义 类变量定义 类方法定义(@classmethod) 静态方法定义(@staticmethod) |
创建一个类 用于描述对象的行为和属性 用于创建此类的一个或多个同类对象(实例) |
|
说明
|
1.继承列表可以省略,省略继承列表表示类继承自object 2.类名必须为标识符 3.类名实质上是变量,他绑定一个类 |
|
示例
|
#定义一个简单的类 class Dog: '''这个类用于描述一种小动物的行为和属性''' pass dog1 = Dog() #创建一个新的Dog类的对象 print(id(dog1))#打印这个对象的id dog2 = Dog()#创建另外一个新的Dog类的对象 print(id(dog2)) #对比 lst1 = list()#创建一个空列表 print(id(lst1)) lst2 = list()#创建另外一个空列表 print(id(lst2)) |
构造函数
意义 |
构造函数调用表达式 |
|
类名([创建传参列表]) |
||
作用 |
创建这个类的实例对象,并返回此实例对象的引用关系 |
|
实例说明 |
1.实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性) 2.实例可以调用类方法和实例方法 3.实例可以访问类变量和实例变量 |
|
实例方法 |
语法 |
作用 |
Class 类名(继承列表) Def 实例方法(srlf,形参1,形参2…) |
用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为 |
|
说明 |
1.实例方法的实质是函数,是定义在类内的函数 2.实例方法至少有一个形参,第一个形参代表调用这个方法的实例,一般命名为‘self’ |
|
实例方法的调用语法 |
1.实例·实例方法名(调用传参) 2.类名·实例方法名(实例,调用传参) |
示例:
class Dog:
def infos(self):
print(self.color, '的', self.kinds)
def eat(self, food):
'''
当Dog类型的对象吃东西时,用food 属性记住
此对象吃的是什么
'''
print(self.color, '的', self.kinds,
'正在吃', food)
self.food = food
def food_info(self):
print(self.color, '的', self.kinds,
'上次吃的是', self.food)
dog1 = Dog()
dog1.kinds = '京巴' # 为dog1绑定的Dog对象添加kinds属性
dog1.color = '白色' # 创建color实例变量
dog1.color = '黄色' # 改变实例变量color的绑定关系
dog2 = Dog() # 另一个对象
dog2.kinds = '导盲犬'
dog2.color = '黑色'
dog1.infos()
dog2.infos()
# print(dog1.color, '的', dog1.kinds) # 获取属性的数据
# print(dog2.color, '的', dog2.kinds)
dog1.eat('骨头')
dog1.food_info()
# dog2.food_info() # dog2没有food这个属性,调用出错
练习:
#定义一个描述人的信息的类:Human
# class Human:
# def set_info(self,n,a,addr = '不详'):
# '''此方法为人添加:姓名,年龄,家庭住址属性'''
# self.name = n
# self.age = a
# self.address = addr
# def show_info(self):
# '''此处显示此人的信息'''
# print(self.name,'今年',self.age,'岁 家庭住址'
# ,self.address )
# h1 = Human()
# h1.set_info('小张','20','北京市朝阳区')
# h2 = Human()
# h2.set_info('小李','18')
# h1.show_info() #小张 今年 20 岁 家庭住址:
# h2.show_info()
实例属性
实例属性attribute(实例变量) |
每个实例可以用自己的变量,称为实例变量(也叫属性) |
|
使用语法 |
实例·属性名 |
|
属性的赋值规则: 1. 首次为属性赋值则创建此属性 2.再次为属性赋值则改变属性的绑定关 |
||
作用 |
记录每个对象自身的数据 |
|
删除属性 |
del 语句 |
|
语法 |
del 对象·属性名 |
示例:
class Dog:
pass
dog1 = Dog()
dog1 = color = ‘白色’ #添加属性
del = dog.color #删除属性
del总结
1)删除变量 |
del a |
2)删除列表中的元素 |
Del L[0] |
3)删除字典中键 |
Del d[‘name’] |
4)删除对象的属性 |
Del dog1.color |
初始化方法
作用 |
对新创建的对象添加属性等初始化操作 |
语法格式 |
Class 类名(继承列表): Def _init_(self[,形参列表]) 语句块 注:[ ]里的内容代表可省略 |
说明 |
1. 初始化方法名必须为_init_不可改变 2. 初始化方法会在构造函数创建实例后自动调用,且将实例自身通过第一个参数self传入del_init_方法 3. 构造函数的实参将通过_init_方法的参数列表传入到_init_方法中 4. 初始化方法内如果需要return语句返回,则只能返回None |
示例:
# class car:
# def __init__(self,clr,brand,model):
# self.color = clr #颜色
# self.brand = brand #品牌
# self.model = model #型号
# #print('car的初始化方法被调用')
# def run(self,speed):
# print(self.color,'的',self.brand,
# self.model,'正在以',speed,
# '公里/小时的速度行驶')
# c1 = car('红色','奥迪','A6')
# c1.run(200)
# c2 = car('蓝色','TESLAS','Model S')
# c2.run(150)
练习:
写一个学生类,用来描述学生信息
要求:
1)为该类添加初始化方法,实现在创建对象时自动设置'姓名','年龄','成绩'属性
2)添加set_score
方法能为对象修改成绩信息,并限制成绩在0~100之间
3)添加show_info方法打印学生对象的信息
class Student:
def __init__(self,name,age,score=0):
self.name = name
self.age = age
self.score = score
def set_score(self,score):
if 0 <= score <= 100:
self.score = score
else:
#通知调用者,调用实参不合法
raise ValueError('值不在相应的范围内')
def show_info(self):
print(self.name,'今年',
self.age,'岁'
' 成绩是',self.score)
def get_score(self):
return self.score
s1 = Student('小其',17,59)
s1.set_score(70)
s1.show_info()
print('s1绑定的对象为:',s1.get_score())
析构方法
语法 |
Class 类名(继承列表): Def __del__(self): 语句块 |
作用 |
通常用来释放此对象占用的资源 |
说明 |
1. 析构方法会在对象被销毁时自动调用 2. Python语句建议不要在对象销毁时做任何事情,因为对象销毁的时间难以确定 |
示例:
class Car:
def __init__(self,name):
self.name = name
print("汽车",name,"对象被创建")
def __del__(self):
print("汽车",self.name,'对象被销毁')
c1 = Car("BYD E6")
del c1
while True:
print('程序结束')
预置的实例属性
语法 |
__dict__属性 __dict__属性绑定一个存储此实例自身变量的字典 |
示例
class Dog:
pass
dog1 = Dog()
print(dog1.__dict__) #{}
dog1.color = "白色"
print(dog1.__dict__) #{'color':'白色'}
__class__属性
语法 |
__class__属性绑定创建此实例的类(类实例) |
作用 |
可以借助于此属性来访问创建此实例的类 |
示例:
class Dog:
pass
dog1 = Dog()
print(dog1.__class__)
dog2 = dog1.__class__()
print(dog2.__class__)
用户类的函数
种类 |
1.isinstance(obj, class__or__tuple) |
2.Type(obj) |
返回这个对象obj是否是某个类的对象,或者某些类中的一个类的对象,如果是则返回Ture,否则返回False |
返回对象的类 |
示例:
#在交互模式下运行
isinstance (3.14,float) #Ture
isinstance(python,str) #Ture
#在编辑器下运行
class Dog:
pass
deg1 = Dog()
isinstance(dog1,Dog) #Ture
练习:
有两个人(Human):
1.姓名:张三 年龄:35
2.姓名:李四 年龄:8
行为:
1.教别人学东西 teacd
2.工作赚钱 work
3.借钱 borrow
用程序描述如下事情:
张三 教 李四 学 python
李四 教 张三 学 滑冰
张三 上班 赚了 1000元钱
李四 向 张三 借了 200元钱
显示李四的全部信息
显示张三发全部信息
答案:
class Human:
def __init__(self, name, age):
#1创建函数加入姓名年龄
self.name = name # 姓名
self.age = age # 年龄
self.money = 0 # 钱数
self.skill = [] # 技能
def teach(self, other, skl):
#2创建函数得到新学技能(other)代表其他人
other.skill.append(skl) # other得到了技能
print(self.name, '正在教', other.name,
'学', skl)
def work(self, money):
#3创建函数上班赚了多少钱
self.money += money
print(self.name, '上班赚了', money, '元钱')
def borrow(self, other, money):
#4创建函数本人向(other)其他人借钱
'''借钱成功返回True,失败返回False'''
# 先判断other没有没钱借
if other.money > money:
other.money -= money
self.money += money
print(other.name, '借给了',
self.name, money, '元钱')
return True
print(other.name, '没借给', self.name)
return False # 借钱失败
def show_info(self):
#5创建函数综合起来得到新的技能,有多少钱
print(self.age, "岁的", self.name,
'有技能:', self.skill, ',钱包内的钱数是',
self.money)
zhang3 = Human("张三", 35)
li4 = Human('李四', 8)
#传参给1
zhang3.teach(li4, 'python')#张三教李四学技能
li4.teach(zhang3, '滑冰')#李四教张三学技能
#传参给2
zhang3.work(1000) # 张三 上班 赚了 1000元钱
#传参给3
li4.borrow(zhang3, 200) # 李四 向 张三 借了 200元钱
#传参给4
zhang3.show_info()
li4.show_info()
#传参给5
练习:
将之前的学生信息管理
原代码中用字典来保存每个学生信息,现改为用对象来保存每个学生的信息
学生类的存入模块student.py中