类和对象(一)

一、类:

  • 类等价于模板,根据模板创建出来的东西叫做对象。
  • 类和对象的关系如下,根据模型创造出来的实物叫做对象,对象看得见摸的着,类就是一个模型:
    在这里插入图片描述
  • 区分类和对象:
    在这里插入图片描述

类(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转化一下
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值