一、类:
- 类等价于模板,根据模板创建出来的东西叫做对象。
- 类和对象的关系如下,根据模型创造出来的实物叫做对象,对象看得见摸的着,类就是一个模型:
- 区分类和对象:
类(Class)由3个部分组成
- 类的名称:类名
- 类的属性:一组数据
- 类的方法:允许对进行操作的方法(行为)
1.1 创建一个类:
class Cat:
#方法
def eat(self):
print("猫吃鱼.....")
def drink(self):
print("猫在喝可乐....")
# 创建一个对象
tom = Cat()
- 这里实现的是创建了一个类,调用Cat()这句话就是创建了一个对象,此时操作系统会在内存开辟一块空间,然后调用完Cat()之后它是会返回一个值的,它返回的值是这个对象的引用,也就是这块内存空间的地址,同时将它赋值给tom变量。
程序执行流程图如下:
1.2 调用类的方法
- 调用tom指向的对象里的eat()和drink()方法
#调用tom指向的对象中的方法
tom.eat()
tom.drink()
程序执行流程图如下:
1.3 给对象添加属性①
class Cat:
# 属性
# 方法
def eat(self):
print("猫吃鱼.....")
def drink(self):
print("猫在喝可乐....")
# 创建一个对象
tom = Cat()
# 调用tom指向的对象里的方法
tom.eat()
tom.drink()
# 给tom指向的对象添加2个属性
tom.name = "汤姆"
tom.age = 40
- 属性的实质就是一个变量,此处tom指向的是谁,就给谁里面添加name这个变量叫做“汤姆”
程序流程图如下:
此时如果想要获取对象的属性,方式①:
class Cat:
# 属性
# 方法
def eat(self):
print("猫吃鱼.....")
def drink(self):
print("猫在喝可乐....")
def introduce(self):
print("%s的年龄是:%d" % (tom.name, tom.age)
# 创建一个对象
tom = Cat()
# 调用tom指向的对象里的方法
tom.eat()
tom.drink()
# 给tom指向的对象添加2个属性
tom.name = "汤姆"
tom.age = 40
# 获取属性的第1种方式
print("%s的年龄是:%d"%(tom.name,tom.age))
进一步将获取属性的方式集成到类的方法里:
class Cat:
# 属性
# 方法
def eat(self):
print("猫吃鱼.....")
def drink(self):
print("猫在喝可乐....")
def introduce(self): # 获取对象属性的方式 2
print("%s的年龄是:%d" % (tom.name, tom.age)
# 创建一个对象
tom = Cat()
# 调用tom指向的对象里的方法
tom.eat()
tom.drink()
# 给tom指向的对象添加2个属性
tom.name = "汤姆"
tom.age = 40
# 获取属性的第1种方式
# print("%s的年龄是:%d"%(tom.name,tom.age))
# 获取对象属性的方式2
tom.introduce()
但是此时遇到了一个问题,如果我还要根据这个类定义一个对象呢:
lanmao = Cat()
lanmao.name = "蓝猫
lanmao.age = 10
lanmao.introduce()
- 此时根据上面那种定义的方式打印出来的依然是tom的信息。程序流程框图如下所示:
1.4 根据上面的问题引入self的作用
- self 的作用:此处 self 表示的是 self 从哪个对象调用的这个方法,self就是谁。tom去调用方法的时候 self 就是tom,lanmao去调用 self 的时候 self 就是 lanmao。
tom.introduce()
等价于tom.introduce(tom)
,谁调用该方法就把谁当做参数传入进去,但是此处不要加入参数tom,因为Python解释器会自动把你对象的引用传递过去。
二、__init__方法:
创建对象的过程如下:
tom = Cat()
创建一个对象叫tom- Python会自动调用
__init__
方法 - 返回创建的对象的引用给tom
class Cat:
# 定义了一个Cat类
# 初始化对象
def __init__(self, new_name, new_age):
self.name = new_name
self.age = new_age
def drink(self):
print("猫喝kele......")
def eat(self):
print("猫吃鱼......")
def introduce(self):
print("%s的年龄是%d"%(self.name,self.age))
注意:正是由于Python会自动调用__init__
方法,此时Python会自动把这个对象的引用传给self,从而self就指向了这个对象,所以一般会在__init__
方法里做属性的初始化工作即默认值的设定。自动调用完这个之后,会返回创建的对象的引用给 tom,此时tom才接收这个对象的引用。
详细版调用__init__方法的流程
三、__str__方法:
3.1 不调用__str__方法去打印一个对象
- 它打印出来的结果是通过这个类创建的这个对象的引用
class Cat:
# 定义了一个Cat类
# 初始化对象
def __init__(self, new_name, new_age):
self.name = new_name
self.age = new_age
def drink(self):
print("猫喝kele......")
def eat(self):
print("猫吃鱼......")
def introduce(self):
print("%s的年龄是%d"%(self.name,self.age))
# 创建一个对象
tom = Cat("汤姆",40)
lanmao = Cat("蓝猫",10)
print(tom)
print(lanmao)
程序打印结果如下,分别表示用Cat这个模板创建出来的对象的地址:
3.2 加入__str__方法
- 当你想直接取这个对象的描述信息的时候,Python解释器会自动调用这个方法,这个方法return的是什么将来打印出来的描述信息就是什么。
class Cat:
# 定义了一个Cat类
# 初始化对象
def __init__(self, new_name, new_age):
self.name = new_name
self.age = new_age
def __str__(self):
return "%s的年龄是:%d"%(self.name,self.age)
def drink(self):
print("猫喝kele......")
def eat(self):
print("猫吃鱼......")
def introduce(self):
print("%s的年龄是%d"%(self.name,self.age))
# 创建一个对象
tom = Cat("汤姆",40)
lanmao = Cat("蓝猫",10)
print(tom)
print(lanmao)
四、练习:烤地瓜
class SweetPotato:
def __init__(self):
self.coodedString = '生的'
self.cookedLevel = 0
self.condiments = []
def __str__(self):
return "地瓜 状态:%s(%d),添加的作料有:%s"%(self.coodedString, self.cookedLevel,str(self.condiments))
def cook(self,cooked_time):
self.cookedLevel += cooked_time
if self.cookedLevel >= 0 and self.cookedLevel < 3:
self.coodedString = "生的"
elif self.cookedLevel >= 3 and self.cookedLevel < 5:
self.coodedString = "半生不熟"
elif self.cookedLevel >=5 and self.cookedLevel < 8:
self.coodedString = "熟了"
elif self.cookedLevel > 8:
self.coodedString = "烤糊了"
def addCondiments(self, item):
self.condiments.append(item)
#创建了一个地瓜对象
di_gua = SweetPotato()
#开始烤地瓜
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.addCondiments("大蒜")
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.addCondiments("番茄酱")
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.addCondiments("孜然")
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.addCondiments("芥末")
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
- 注意:若自己定义的方法想要去使用
__init__
方法定义的几个属性,不应该理解成我定义的方法用到了__init__方法里的变量,应该理解成是用的是当前self指向的对象里的属性,在方法里面定义的不一定就非的是变量。 self.condiments
是一个列表,列表不能用%s打印,要用str转化一下