1.面向对象编程–oop(object oriented programming)
面向过程–思考问题时,首先分析怎么按照步骤实现,然后将问题拆解成若干步骤,并一步步完成功能–怎么做
面向对象–关注的是设计思维,关注顶层设计,不考虑细节究竟如何实现(比如洗车,直接给洗车店,不用管)–给谁做
2.类和对象
类–一个模板,模板中可以有多个函数,并且函数里实现一些功能(造汽车的图纸)----一组相同或相似特征【属性】和行为【方法】的一系列对象组合
组成部分:类名,属性(数据),方法
例:类名:人;属性:身高,体重;方法:吃饭,跑步
对象–根据模板创建的示例,通过实例对象可以执行类中的函数(用图纸造的汽车)----类的实例化
定义:
#定义类和对象
'''
类结构--类名,属性,方法
class 类名:
属性--类里面定义的变量(类属性)
方法
'''
class Person(object):#object可以省略
#属性-特征
name = 'jey'#类属性
age = 22
'''
**实例属性:**
定义在方法内使用self定义的属性
'''
def __init__(self):
self.name = '小明'#实例属性,归实例方法所有
pass
#方法-行为
def eat(self):
print('我要恰饭啦')
pass
def run(self):
print('跑起来!')
pass
'''
对象创建【实例化】
对象名 = 类名()
'''
lee = Person()
lee.eat()#调用类的方法
print("{}的年龄是{}".format(lee.name,lee.age))
3.实例方法
在类的内部,使用def关键字可以定义一个实例方法,不同的是,实例方法必须包含参数self[名字标识可以是其他的名字,只是标识占位],并且是第一个参数.
实例方法归类所有,可以通过类调用
4.init方法–初始化实例属性
class Person(object):#object可以省略
'''
# init -- 定义类时直接定义,(统一设定)其他实例就可以直接调用,不需要一一定义
创建新对象时自动执行
'''
# def __init__(self):
# self.name = '小明'
# self.sex = '女'
# self.age = 20
# pass
'''
也可以通过传参数的方式灵活定义,通过传参的方法定义实例属性
'''
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
pass
#方法也可以传参,并且可以使用self实例属性
def eat(self,food):
print(self.name+'我要恰饭啦'+food)
pass
def run(self):
print('跑起来!')
pass
#添加实例属性 python可以直接通过对象添加实例属性
#如过类里面同一定义过实例属性,也可以通过下列方式修改使用,但只限该对象
# xw = Person();
# xw.name = '小王'
# xw.sex = '男'
# print(xw.name,xw.sex)
#xm = Person();
#print(xm.name)
#直接传递参数定义实例属性
zp = Person('帐篷',20,'男')
print(zp.name,zp.age,zp.sex)
zp.eat('苹果')
5.self参数
self和对象指向同一内存地址,可以认为self就是对象的引用。
在某个对象调用其方法时,python解释器会把该对象作为第一个参数传递给self,因此开发者只需要传递后面参数即可
class Person:
def eat(self):#self只有在类中定义实例方法时才有意义,
# 在调用时不必传入相应参数,而是由解释器自动去指向
print("self=%s",id(self))#打印self的地址
pass
pass
#实例化一个对象
xw = Person()
print('xw=%s',id(xw))#xw=%s 55746600
xw.eat()#self=%s 55746600
#self和对象的地址是一样的,表示将对象作为self参数传递了进去
6.魔术方法
一些内置好的特定的方法,方法名为__xxx___,在特定操作时会被调用
#str方法
class Animal:
def __init__(self,name,color):
self.name = name
self.color = color
print('定义实例属性')
#定义一个str方法,就可以直接打印对象信息
def __str__(self):
return '%s是%s色的'%(self.name,self.color)
#new方法--创建对象实例的方法,每调用一次,就会生成一个新的对象cls(class的缩写)
#new方法是类中第一个使用的方法
#至少有一个参数cls代表要实例化的类
def __new__(cls, *args, **kwargs):
print('创建一个方法')
return object.__new__(cls)#返回一个新的对象,要返回对象,才可以成功创建对象
pass
dog = Animal('旺财','white')
#在类没有定义str时
#直接打印的话,打印的是对象的内存地址--<__main__.Animal object at 0x0353A028>
#定义了str后,打印对象时就会按照str返回值的格式输出数据
#旺财是white色的
print(dog)
7.实例
双人对战:
#双人对战
#属性
#name-姓名
#blood-血量
#方法
#tong()--扣对手10点血
#kanren()--扣对手15点学
#chiyao()--回复自己10滴血
#__str__打印玩家状态
import time#导入时间包,可以设定休眠时间
class Role:
def __init__(self,name,hp):
self.name = name
self.hp = hp
pass
def tong(self,enemy):
enemy.hp-=10
print('%s捅了%s一刀'%(self.name,enemy.name))
pass
def kanren(self,enemy):
enemy.hp-=15
print('%s砍了%s一刀'%(self.name,enemy.name))
pass
def chiyao(self):
self.hp+=10
print('%s吃了一口药'%(self.name))
pass
def __str__(self):
return '%s还有%s血量'%(self.name,self.hp)
ygc = Role('叶孤城',100)
xmcx = Role('西门吹雪',100)
while True:
if ygc.hp<=0 or xmcx.hp<=0:
break
ygc.tong(xmcx)
ygc.kanren(xmcx)
xmcx.chiyao()
print(ygc)
print(xmcx)
print('*****************')
time.sleep(1)#休眠2秒再执行
print('游戏结束')