回顾面向对象之前对于Python的类与对象

  Python弱化语法,写法比较自由,类与对象这里还是要稍微和其他的主流语言稍微有点区别。
  类,就是一类事物的抽象化统称啊。就是这一系列事物,可能本来没有关系的,但是这一些系列事物是有共同的行为(功能)的,就可以抽象化为一类。
  比如生活中已经有的类概念,像共享单车、汽车、火车、飞机,这就是一个交通工具类。另外像共享单车、共享充电宝、共享汽车,又抽象化为共享产品,这也是一个类。在交通工具类里它们都有共同的行为(或功能)是可以运输人员从一个地方到另一个地方,在共享产品类它们共同的行为(或功能)就是可以把物品的价值分享给别人。因此,理解类的概念的时候应该也很好的清楚了类与类的本质区别,就是行为或者功能的不同。
  那么对象呢?类是一类事物的统称,对象就是这一类事物中的一个具体的个体。首先要明白对象与类的区别:是个体与群体的区别、是具体与抽象的区别,是邓超的老婆孙俪与老婆、xx学校2年x班小白菜同学与小学生的区别。对象是从类中具体化得来的。那么说到这大概都知道对象是什么意思了,那么来说说对象的区别。比如假如我们有一个类叫做,女星类,它的对象可以有宁静、张雨绮、张含韵,她们共同的行为是都能表演、唱歌、演戏,但是她们三个的身高、体重、胸围都有不同啊,虽然整个女星都有这些属性,但是她们三个这些属性的数值不同。因此,对象与对象的区别,就是数据的不同。

  下面创建一个类,帮助自己理解下Python里面类变量、类方法、实例变量、实例方法、静态方法的区别。因为最近乘风破浪的姐姐挺火的是吧?ok,我说过万物皆对象,那就整这个。

"""
	类:乘风破浪的姐姐
	属性:姓名、年龄、身高、胸围
	行为:唱歌、跳舞
"""
class SuperBigSister:
	"""
		实例化成员:具体的姐姐、必须有名字、年龄、身高、胸围属性
	"""
	sister_team = []
	def __init__(self,name,age,height,bustline):
		self.name = name
		self.age = age
		self.height = height
		self.bustline = bustline
	def sing(self,song):
		print(self.name,"演唱了一首",song)

	def dance(self,dancetype):
		print(self.name,"跳了一支",dancetype)

#具体到个人的实例,宁静姐姐
sisiter_ningJing = SuperBigSister("宁静",48,168,"B")
#具体到个人的实例,张雨绮姐姐
sisiter_zhangYuQi = SuperBigSister("张雨绮",34,166,"36D")
#具体到个人的实例,张含韵姐姐
sisiter_zhangHanYun = SuperBigSister("张含韵",32,162,"对A")
#宁静姐姐独唱一首歌 吻别的那片海
sisiter_ningJing.sing("吻别的那片海")
#张雨绮姐姐唱跳 粉红的回忆
sisiter_zhangYuQi.sing("粉红的回忆")
sisiter_zhangYuQi.dance("随心的舞蹈")
#张含韵姐姐唱一首 wonderfulu
sisiter_zhangHanYun.sing("wonderfulu")

#输出结果:
#宁静 演唱了一首 吻别的那片海
#张雨绮 演唱了一首 粉红的回忆
#张雨绮 跳了一支 随心的舞蹈
#张含韵 演唱了一首 wonderfulu

  这就创建三个对象,分别是宁静、张雨绮、张含韵。注意在内存图里是什么样子,稍微修改下把三个姐姐放进一个组里:

sister_team = []
sister_team.append(sisiter_ningJing)
sister_team.append(sisiter_zhangYuQi)
sister_team.append(sisiter_zhangHanYun)

看下内存图:
在这里插入图片描述
画内存图的目的在于说明,一个对象就相当于把这些数据存放了一份,一个对象就有一份数据,100个对象就有100分数据,这就是实例数据,只为这个对象而存在的,各个对象之间的数据也是相互独立的互不干扰。
而实例方法是公用的,区别是,每次调用生成的栈帧不同而已。但是每次调用都会生成栈帧,操作其对应实例对象的数据后,再销毁栈帧。像乘风破浪的舞台,舞台是公用的,但是每次上去的姐姐不一样、表演的节目不一样(只是打比方,栈帧每次是重建的,舞台不能说拆就拆哦)。
  那么,现在来说说有的姐姐被淘汰的事情,估计有的姐姐被淘汰她的粉丝会非常难过,像宁静姐姐如果走了我会很难过。丁当走了宁静哭的网友纷纷表示她上次哭这么惨的时候是多尔衮死的时候
。。。那么我们的程序里就给姐姐们一个复活卡吧,三人团队我们一共给她们两张复活卡。淘汰的姐姐可以通过消耗团队的复活卡复活。想想这设定,这个复活卡,和前面那些身高体重什么的啥区别?这个复活卡是公用的吧,每个对象都有权利去使用吧!对,类变量就这个意思,只不过区别是建议使用类变量去直接操作。
  那么我们来加个方法,加个类变量。看代码:

"""
	类:乘风破浪的姐姐
	属性:姓名、年龄、身高、胸围
	行为:唱歌、跳舞
"""
class SuperBigSister:
	"""
		实例化成员:具体的姐姐、必须有名字、年龄、身高、胸围属性
	"""
	#类变量复活卡

	resurgenceCard = 2

	def __init__(self,name,age,height,bustline):
		self.name = name
		self.age = age
		self.height = height
		self.bustline = bustline
	def sing(self,song):
		print(self.name,"演唱了一首",song)
	def SaveTeammate(self,SuperBigSister):
		SuperBigSister.resurgenceCard -= 1
		print(self.name,"使用复活卡复活了",SuperBigSister.name,"复活卡剩余",str(SuperBigSister.resurgenceCard),"张")


	def dance(self,dancetype):
		print(self.name,"跳了一支",dancetype)

#具体到个人的实例,宁静姐姐
sisiter_ningJing = SuperBigSister("宁静",48,168,"B")
#具体到个人的实例,张雨绮姐姐
sisiter_zhangYuQi = SuperBigSister("张雨绮",34,166,"36D")
#具体到个人的实例,张含韵姐姐
sisiter_zhangHanYun = SuperBigSister("张含韵",32,162,"对A")
#宁静姐姐独唱一首歌 吻别的那片海
sisiter_ningJing.sing("吻别的那片海")
#张雨绮姐姐唱跳 粉红的回忆
sisiter_zhangYuQi.sing("粉红的回忆")
sisiter_zhangYuQi.dance("随心的舞蹈")
#张含韵姐姐唱一首 wonderfulu
sisiter_zhangHanYun.sing("wonderfulu")

sister_team = []
sister_team.append(sisiter_ningJing)
sister_team.append(sisiter_zhangYuQi)
sister_team.append(sisiter_zhangHanYun)

#复活队友,使用团队资源复活卡,也就是类变量,所有对象的共有资源
sisiter_ningJing.SaveTeammate(sisiter_zhangHanYun)

#输出结果为:
#宁静 演唱了一首 吻别的那片海
#张雨绮 演唱了一首 粉红的回忆
#张雨绮 跳了一支 随心的舞蹈
#张含韵 演唱了一首 wonderfulu
#宁静 使用复活卡复活了 张含韵 复活卡剩余 1 张

  类变量使用建议还是使用类名进行访问不建议使用对象访问。
  对象方法也建议使用对象访问而不是使用类访问。
拯救队友的事情,觉得是团队的事情,是不是不该由个人宣布呢?好吧,那么做个类方法。

	@classmethod
	def SaveTeammate(cls,SuperBigSister):
		SuperBigSister.resurgenceCard -= 1
		print("本队复活了",SuperBigSister.name,"复活卡剩余",str(cls.resurgenceCard),"张")

#调用类方法,复活队友
SuperBigSister.SaveTeammate(sisiter_zhangHanYun)

#输出
#本队复活了 张含韵 复活卡剩余 2 张

  最后静态方法,我记得如果是在C#里,静态方法里面除了方法内部的变量,操作的其他变量必须也是静态的。在Python中静态方法也被描述为不操作类数据和对象数据的方法,哪怕写成一个类外方法都可以,为了维护面向对象的一致性所以包含到类中去。

	@classmethod
	def SaveTeammate(cls,SuperBigSister):
		SuperBigSister.resurgenceCard -= 1
		print("本队复活了",SuperBigSister.name,"复活卡剩余",str(cls.resurgenceCard),"张")
	@staticmethod
	def resurgenceMessage(SuperBigSister):
		print(SuperBigSister.name,"已经复活")
#调用类方法,复活队友
SuperBigSister.SaveTeammate(sisiter_zhangHanYun)
#调用静态方法通知选手复活
SuperBigSister.resurgenceMessage(sisiter_zhangHanYun)

#输出
#本队复活了 张含韵 复活卡剩余 2 张
#张含韵 已经复活

  回忆到现在,关于类的回忆也基本回忆完了。结束~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值