面对对象三大特征: 封装、继承、多态
类和对象的关系:
-
类是对象的 模型
-
对象是类的 实体
类的构成: 类(class)
-
类的名称:类名
-
类的属性:一组数据
-
类的方法:行为
格式:
类名 用大驼峰 无特殊要求,类名里面都用object(最顶级父类)
class 类名(object):
创建对象:
可根据已定义的类,创建一个或多个对象
格式: 对象名=类名( )
class Hero(object):
def move(self):
print("快速移动")
def attack(self):
print("发出攻击")
ya_suo=Hero( ) 对象名=类名( ) 必须要写 不写的话系统报错
ya_suo.move( ) 输出 move 函数
ya_suo.attack( ) 输出 attack 函数
输出结果: 快速移动
发出攻击
查看对象的储存地址:
- 二进制: print(对象名)
- 十进制: print(id(对象名))
添加和获取对象的属性:
class Hero(object):
def move(self):
print("快速移动")
def attack(self):
print("发出攻击")
ya_suo=Hero 对象名=类名( ) 必须要写 不写的话系统报错
ya_suo.name="亚索" 赋值
ya_suo.hp=2345
print("<%s>英雄血量为:%d"%(ya_suo.name,ya_suo.hp))
输出结果: <亚索>英雄血量为:2345
在方法内通过 self 获取对象属性:
class Hero(object):
def move(self):
print("快速移动")
def attack(self):
print("发出攻击")
def info(self):
print("<%s>英雄血量为:%d"%(self.name,self.hp))
ya_suo=Hero 对象名=类名( ) 必须要写 不写的话系统报错
ya_suo.name="亚索"
ya_suo.hp=2345
ya_suo.info( ) 输出 info 函数
输出结果为: <亚索>英雄血量为:2345
魔法方法:
1. __init__( )
通常用来做 实例属性初始化 和 赋值
class Hero(object):
def __init__(self):
self.name="亚索"
self.hp=2345
def move(self):
print("快速移动")
def attack(self):
print("发出攻击")
def info(self):
print("<%s>英雄血量为:%d"%(self.name,self.hp))
ya_suo=Hero( ) 对象名=类名( ) 必须要写 不写的话 系统报错
ya_suo.info( ) 输出 info 函数
输出结果为: <亚索>英雄血量为:2345
2.带参数的__init__( )方法: 一个类 建立多个对象
class Hero(object):
def __init__(self,name,hp):
self.name=name
self.hp=hp
def info(self):
print("%s的血量为:%d"%(self.name,self.hp))
ya_suo=Hero("亚索",2500)
ya_suo.info( )
man_wang=Hero("蛮王",3000)
man_wang.info( )
注意:
- 在类的内部获取 属性 和 实例方法,通过self来获取
- 在类的外部获取 属性 和 实例方法,通过对象名来获取
- 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址
- 实例方法是所有对象共享的,只占一份内存空间,类会通过self来判断是哪个对象调用了实例方法
3. __str__( )
方法: 返回一个字符串,作为这个对象的描述信息
class Hero(object):
def __init__(self,name,hp):
self.name=name
self.hp=hp
def __str__(self):
return "英雄<%s>,血量为:%d"%(self.name,self.hp)
ya_suo=Hero("亚索",2500)
print(ya_suo) 返回对象的描述信息
4. __del__( )
方法: 删除方法,默认调用
class Hero(object):
def __init__(self,name):
print("init 方法被使用")
self.name=name
def __del__(self):
print("del 方法被调用")
ya_suo=Hero("亚索")
print("%s被删除了"%ya_suo.name)
del(ya_suo)
输出结果:init方法被使用
亚索被删除了
del 方法被调用
总结:
- 当变量保存了一个对象的引用时,此对象的引用计数就会 +1
- 当使用del( )删除变量指向对象时,则会减少对象引用计数 -1,当对象的引用计数为0,对象才会被真正的删除(内存被回收)
查看类的文档说明:
print(类名.doc)
烤地瓜问题:
class SweetPotato(object):
def __init__(self):
self.cookedtime=0 烘烤时间
self.cookedstring="生的" 生熟描述
self.tiaoliao=[] 调料
def cook(self,time):
"""把地瓜烤一段时间"""
self.cookedtime+=time
if self.cookedtime>8:
self.cookedstring="烤焦了"
elif self.cookedtime>5:
self.cookedstring="考好了"
elif self.cookedtime>3:
self.cookedstring="半生不熟"
else:
self.cookedstring="生的"
def addtiaoliao(self,items):
"""给地瓜添加调料"""
self.tiaoliao.append(items)
def __str__(self):
ret=self.cookedstring+"地瓜"
ret=ret+"("
for i inself.tiaoliao:
ret=ret+i
ret=ret+")"
return ret
dg=SweetPotato()
dg.cook(1)
dg.addtiaoliao("烧烤味")
print(dg)