python之类

定义类

demo方法:
class 类名:
	方法列表

demo1(新式类):
class Hero(object):
	def info(self):
		print('英雄不问出处')

demo2(旧式类,经典类):
class Hero:
  • 注意:
  • object是python中的所有类的最顶级父类
  • 类名的命名规则按照“大驼峰命名法”
  • info是一个实例方法,第一个参数一般是self,表示实例对象本身,当然了可以将self换成其他的名字,其作用是一个变量,这个变量指向了实例对象。

创建对象

创建对象的格式为:
对象名1 = 类名()
对象名2 = 类名()
对象名3 = 类名()

demo(创建对象):
class Hero(object):
	"""info是一个实例方法,类对象可以调用实例方法,实例方法的第一个参数一定参数是self"""
	def info(self):
		print(self)
		print("python-self")

#Hero这个类,实例化了一个对象,taidamier
taidamier = Hero()

#对象调用实例方法info(),执行info()里的代码
# . 表示选择属性或者方法
taidamier.info()

print(taidamier)#打印对象,则默认打印对象在内存的地址,结果等同于info里的print(self)

print(id(taidamier))  # id(taidamier) 则是内存地址的十进制形式表示

有参数的__init__()方法

demo:
class Hero(object):
"""定义了一个英雄类,可以移动和攻击"""

def __init__(self, name, skill, hp, atk, armor):
    """ __init__() 方法,用来做变量初始化 或 赋值 操作"""
   # 英雄名
    self.name = name
    #技能
    self.skill = skill
    #生命值:
    self.hp = hp
    #攻击力
    self.atk = atk
    #护甲值
    self.armor = armor

#实例化英雄对象时,参数会传递到对象的__init__()方法里
taidamier = Hero("泰达米尔", "旋风斩", 2600, 450, 200)
gailun = Hero("盖伦", "大宝剑", 4200, 260, 400)

#调用info方法
taidamier.info()
gailun.info()

结果:
英雄 泰达米尔 的生命值 :2600
英雄 泰达米尔 的攻击力 :450
英雄 泰达米尔 的护甲值 :200
英雄 盖伦 的生命值 :4200
英雄 盖伦 的攻击力 :260
英雄 盖伦 的护甲值 :400
  • 说明:
  • 通过一个类,可以创建多个对象,就好比通过一个模具创建多个实体一样
  • 在__init__(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个参数,那么__init__(self)中除了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)

注意

  • 在类内部获取 属性 和 实例方法,通过self获取;
  • 在类外部获取 属性 和 实例方法,通过对象名获取;
  • 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址;
  • 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。

str()魔法方法

demo:
class Hero(object):
"""定义了一个英雄类,可以移动和攻击"""

def __init__(self, name, skill, hp, atk, armor):
    """ __init__() 方法,用来做变量初始化 或 赋值 操作"""
    #英雄名
    self.name = name
    #技能
    self.skill = skill
    #生命值:
    self.hp = hp
    #攻击力
    self.atk = atk
    #护甲值
    self.armor = armor

def move(self):
    """实例方法"""
    print("%s 正在前往事发地点..." % self.name)

def attack(self):
    """实例方法"""
    print("发出了一招强力的%s..." % self.skill)

def __str__(self):
	"""这个方法是一个魔法方法 (Magic Method) ,用来显示信息
        该方法需要 return 一个数据,并且只有self一个参数,当在类的外部 print(对象) 则打印这个数据"""
	return "英雄 <%s> 数据: 生命值 %d, 攻击力 %d, 护甲值 %d" % (self.name, self.hp, self.atk, self.armor)

taidamier = Hero("泰达米尔", "旋风斩", 2600, 450, 200)
gailun = Hero("盖伦", "大宝剑", 4200, 260, 400)

#如果没有__str__ 则默认打印 对象在内存的地址。
#当类的实例化对象 拥有 __str__ 方法后,那么打印对象则打印 __str__ 的返回值。
print(taidamier)
print(gailun)
  • 说明
  • 在python中方法名如果是__xxx__()的,那么就有特殊的功能,因此叫做魔法方法
  • 当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__(self)方法,那么就会打印从这个方法中return的数据。
  • __str__方法通常返回一个字符串,作为这个对象的描述信息。

del()方法

创建对象后,python解释器默认调用__init__()方法;

当删除对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。

class Hero(object):

#初始化方法
#创建完对象后会自动被调用
def __init__(self, name):
	print('__init__方法被调用')
	self.name = name

#当对象被删除时,会自动被调用
def __del__(self):
	print("__del__方法被调用")
	print("%s 被 GM 干掉了。。" % self,name)

#创建对象
taidamier = Hero("泰达米尔")

#删除对象
print("%d 被删除1次" % id(taidamier))
del(taidamier)

总结:

  • 当有变量保存了一个对象引用时,则对象的引用计数就会加1
  • 当使用del()删除变量指向的对象时,则会减少对象的引用计数,如果对象的引用计数部位1,那么会让这个对象的引用计数减1,当对象的用用计数为0的时候,则对象才会被真正删除(内容被收回)

应用:烤地瓜

  • 属性如下:
  • cookedLevel:数字;0-3表示生的,超过3表示半熟,超过5表示烤好了,超过8表示烤糊了,地瓜开始时是生的
  • cookedString:字符串,描述地瓜的生熟程度
  • condiments: 地瓜的配料列表,比如番茄酱,孜然,芥末等
  • 方法如下:
  • cook():把地瓜烤上
  • addCondiments():添加配料
  • init():设置默认的属性
  • str():让print的结果看起来更好一些

定义类,并且定义__init__()方法

demo:
#定义地瓜类
class SweetPotato:
	
	#定义初始化方法
	def __init__(self):
		self.cookedLevel = 0
		self.cookedString = "生的"
		self.condiments = []

	#定制print时的显示内容
	def __str__(self):
    	msg = self.cookedString + " 地瓜"
    	if len(self.condiments) > 0:
      		msg = msg + "("

        	for temp in self.condiments:
            	msg = msg + temp + ", "
        	msg = msg.strip(", ")

        	msg = msg + ")"
    	return msg

	
	#添加烤地瓜的方法
	def cook(self, time):
		self.cookedLevel += time
		if self.cookedLevel > 8:
			self.cookedString = "烤糊了"
		elif self.cookedLevel >5:
			self.cookedString = "考好了"
		elif self.cookedLevel > 3:
			self.cookedString = "半熟"
		else:
			self.cookedString = "生的"

	 #添加配料
	def addCondiments(self, condiments):
    	self.condiments.append(condiments)

	mySweetPotato = SweetPotato()
	mySweetPotato.cook(4)

应用:存放家具

demo:
#定义一个home类
class Home:
	
	def __init__(self, area):
		#房间剩余的可用面积
		self.area = area
		#默认灯是亮的
		self.light = 'on'	
		self.cantainsItem = []

	def __str__(self):
		msg = '当前房间可用面积为:' + str(self.area)
		if len(self.containsItem) > 0:
			msg = msg + "容纳的物品有:"
			for temp in self.containsItem:
				msg = msg + temp.getName() + ", "
			msg = msg.strip(", ")
		return msg