1.类和对象概念
类相当于一个模板,模板里面有很多的函数。
对象是根据模板创建的实例,通过实例对象执行类里面的函数。
2.定义类和对象
使用class语句创造类
类三要素:名称,属性(相当于人的特征),方法(相当于人的行为)
class Person:
name='hejiao'#类属性
age=24 #类属性
def __init__(self):
self.name= '何娇' #实例属性
def eat(self):#实例方法
print("大口的吃饭")
pass
def run(self):
print("飞快的跑")
pass
pass
#创建一个对象,类的实例化
#格式 对象名=类名
hj=Person()
hj.eat()#调用函数
hj.run()
print("{}的年龄是:{}".format(hj.name,hj.age))#填坑的方式
3.实例方法和属性
在类的内部,通过def来定义实例方法
实例方法外的属性为类属性
实例方法内的属性为实例属性
4.__init__方法
数据初始化赋值
#init传参
class People:
def __init__(self):
self.name='何娇'
self.sex='女'
self.age=24
def eat(self):
print('喜欢吃榴莲')
pass
pass
w=People()
print(w.name)#直接输出的是默认值何娇
#如果有n个对象被实例化,那么就需要添加很多次这样的属性,比较麻烦
#init传递参数改进
class People:
def __init__(self,name,sex,age):#初始化方法,在实例化对象的时候,是自动调用init里的值,完成初始化设置
self.name=name
self.sex=sex
self.age=age
def eat(self,food):
print(self.name+'喜欢吃'+food)
pass
pass
zp=People('张鹏','男生',18)
print(zp.name,zp.sex,zp.age)
zp.eat('香蕉')
5.理解self
1.self指代的就是对象
2.self和对象指向同一个内存地址,可以认为self对对象的引用。
3.self只有在定义类中定义实例方法时才有意义,在调用时不用传入实际参数,而是由解释器自动去指向
4.self名称是可以更改的,可以定义成其他的名字,约定俗成定义为self
class Person:
def __init__(self,pro,name,food):
self.pro=pro#实例属性
self.name=name
self.food=food
print('-----init----函数执行')
pass
def eat(self):#self本身为对象本身,
#实例方法
print('self=%s',id(self))
print('%s 喜欢吃 %s 专业是 %s'%(self.name,self.food,self.pro))#将实例属性引入实例方法中时,要写成self.实例属性
pass
pass
xw=Person('心理学','小王','榴莲') #初始化init的值要放在Person括号内
print('xw=%s',id(xw))
#self的id和xw的id一致,说明self就是xw对象
6.魔法方法 格式 ___xxx___
new和init
new的实例化方法,必须要返回该实例,至少有一个参数是cls代表实例化的类,由python解释器自动提供
init用来做数据的初始化工作,也可以认为是实例的构造方法,用self进行构造
new函数执行要早于init函数
__new__方法用于创建对象并返回对象,当返回对象时会自动调用__init__方法进行初始化。
__new__方法是静态方法,而__init__是实例方法。
def __init__(self):
def __str__(self): # 将对象转换成字符串对象,测试时,打印对象的信息。
return ('%s 喜欢吃 %s 专业是 %s'%(self.name,self.food,self.pro))
def __new__(cls, *args, **kwargs): # 创建对象实例的方法,每调用一次就会得到一个对象。
print('-----new----函数的执行')
# new可以用来控制对象的一些属性限定,经常用来做单例模式的时候使用
return object.__new__(cls) # 在这里真正创建对象实例
pass
class Person:
def __init__(self,pro,name,food):
self.pro=pro#实例属性
self.name=name
self.food=food
print('-----init----函数执行')
pass
def eat(self):#self本身为对象本身,
#实例方法
print('%s 喜欢吃 %s 专业是 %s'%(self.name,self.food,self.pro))#将实例属性引入实例方法中时,要写成self.实例属性
pass
pass
def __str__(self): #将对象转换成字符串对象,测试时,打印对象的信息。
return ('%s 喜欢吃 %s 专业是 %s'%(self.name,self.food,self.pro))
pass
pass
def __new__(cls, *args, **kwargs):#创建对象实例的方法,每调用一次就会得到一个对象。
print('-----new----函数的执行')
#new可以用来控制对象的一些属性限定,经常用来做单例模式的时候使用
return object.__new__(cls)#在这里真正创建对象实例
pass
xw=Person('心理学','小王','榴莲') #初始化init的值要放在Person括号内
xw.eat()
print(xw) #打印字符串对象
7.案例决战紫禁之巅
#双人对战
#决战紫禁之巅两个人物,西门吹雪以及叶孤城
#属性:name 玩家的名字,blood 玩家血量
#方法:tong()捅对方一刀,对方掉血10滴
# kanren()砍对方一刀,对方掉血15滴
# chiyao()吃一颗药,补血10滴
# __str__打印玩家动态
#定义一个类(角色)
import time #导入时间包
class Character:
def __init__(self,name,blood):
self.name=name
self.blood=blood
def tong(self,enemy):
enemy.blood-=10
info='%s捅了%s一刀'%(self.name,enemy.name)
pass
def kanren(self,enemy):
enemy.blood-=15
input=('%s砍了%s一刀'% (self.name, enemy.name))
pass
def chiyao(self):
self.blood+=10
input=('%s吃了一颗补血药,增加了10滴血'%(self.name))
pass
def __str__(self):
return '%s还剩%s血量'%(self.name,self.blood)
xmcx = Character('西门吹雪', 100)
ygc = Character('叶孤城', 100)
while True:
if xmcx.blood<=0 or ygc.blood<=0:
break
print('-------西门吹雪捅叶孤城一刀----')
xmcx.tong(ygc)
print(xmcx)
print(ygc)
print('-------西门吹雪吃药')
xmcx.chiyao()
print(xmcx)
print(ygc)
print('-------叶孤城捅西门吹雪一刀----')
ygc.tong(xmcx)
print(xmcx)
print(ygc)
time.sleep(1)
pass