面向过程 怎么做?
面向对象 谁来做?
先有类再有对象
类只有一个,对象可以有多个
定义类class
对对象的特征描述,通常可以定义成属性
对象具有的行为通常可以定义为方法
在Python中对象几乎是无处不在的
dir()函数可以查看所有属性和方法
增加属性 类名.属性名
可以通过self.访问对象的属性
也可以通过self.调用其他的对象方法
(你推荐在外部增加属性)
__init__初始化方法,专门定义一个类具有哪些属性的方法
excaption 异常
捕获异常
try:可能出现异常的代码块
except OSError as reason:异常信息
finally:是否出现异常都执行
oop特征
封装 继承 多态
self
在类中定义的方法自动会跟着一个self,是该方法默认的一个参数,后面的参数都要保存在self中
公有和私有
私有机制是伪私有,在变量前加__
实则可以用 对象._类名__变量名访问私有变量
继承
class Parent :
class Child(Parent):
子类括号内写父类名,即继承该父类
子类对象不能在自己的方法内部直接访问父类的私有属性和方法
子类对象可以通过父类的公有方法间接访问到私有属性和方法
继承list,其他雷同
class lists(list):
Python多继承
可以一次继承多个父类,同时具有多个父类的方法
如果多个父类中有同名方法,应该避免使用多继承
内置属性__mro__可以查看调用方法顺序
新式类:以object为基类的类(推荐)
旧式类:不以object为基类的类(不推荐)
在多继承时,会影响到方法的搜索顺序
建议:如果没有父类,统一继承object
判断类a是否是类b的子类
issubclass(a,b)
a是否为b的实例对象
isinstance(a,b)
a对象是否有b属性
hasattr(a,b)
返回对象的指定属性值,default提示信息
getattr(a,b,default)
设置a对象中b属性的value值
setattr(a,b,value)
删除对象a中的b属性
delattr(a,b)
魔法方法
被双下划线包围
new(cls[,…])
str(self):
return
方法必须返回一个字符串
封装案例
class Person():
def __init__(self,name,weight):
self.name=name
self.weight=weight
def __str__(self):
return "我叫%s,我的体重是%.2f" %(self.name,self.weight)
def run(self):
print("%s爱跑步,跑步锻炼身体" % self.name)
self.weight-=0.5
def eat(self):
print("%s爱吃饭,吃饭长身体" % self.name)
self.weight+=1
xiaoming=Person("晓明",75.5)
xiaoming.run()
xiaoming.eat()
print(xiaoming)
xiaomei=Person("小美",48.5)
xiaomei.run()
xiaomei.eat()
print(xiaomei)
案例2
class HouseItem():
def __init__(self,name,area):
self.name=name
self.area=area
def __str__(self):
return "这是%s,占地%.f" %(self.name,self.area)
class House():
def __init__(self,house_type,area):
self.house_type=house_type
self.area=area
self.free_area=area
self.item_list=[]
def __str__(self):
return ("户型:%s\n总面积,%.2f[剩余:%.2f]\n家具:%s"
%(self.house_type,self.area,self.free_area,self.item_list))
def add_item(self,item):
print("添加%s" %item)
#判断家具的面积
if item.area>self.free_area:
print("%s家具太大,无法添加" % item.name)
return
#添加家具
self.item_list.append(item.name)
#计算剩余
self.free_area-=item.area
#创建家具
#床
bed=HouseItem("席梦思",4)
print(bed)
#衣柜
chest=HouseItem("衣柜",2)
print(chest)
#餐桌
table=HouseItem("餐桌",1.5)
print(table)
#创建房子
my_house=House("两室一厅",90)
my_house.add_item(bed)
my_house.add_item(chest)
my_house.add_item(table)
print(my_house)
身份运算符
is 是判断两个标识符是不是引用的同一个对象
is not 是判断两个标识符是不是引用不同对象
is与==区别
==用于判定两个值是否相等
多态:不同的子类对象调用相同的父类方法,产生不同的执行结果
案例1:
class Dog(object):
def __init__(self,name):
self.name=name
def game(self):
print("%s玩游戏" %self.name)
class XiaoTianDog(Dog):
def game(self):
print("%s飞到天上去玩" %self.name)
class Person(object):
def __init__(self,name):
self.name=name
def gamewithdog(self,dog):
print("%s和%s愉快的玩耍" %(dog.name,self.name))
dog.game()
xiaotian=XiaoTianDog("啸天")
dog=Dog("狗")
person=Person("小明")
person.gamewithdog(xiaotian)
person.gamewithdog(dog)
创建对象:1在内存中为对象分配空间
调用初始化方法为对象初始化
实例:创建出来的对象叫类的实例