面向对象基础
面向对象的介绍
面向对象编程:oop[object oriented programing]是一种python的编程思路
面向过程·:按照解决问题的步骤去写代码【根据业务逻辑去写代码】
类和对象
类:是具有一组相同或相似特征【属性】和行为【方法】的一系列对象的集合
现实世界 计算机世界
行为------------------> 方法
特征------------------> 属性
对象:对象是实实在在的一个东西,类的的实例化,具象化
类是对象的抽象化 对象是类的一个实列
定义类和对象
创建一个类
class M(object):
方法列表
对象名=类名()
class Person:
name="明米"#类属性
age=10#类属性
def __init__(self):#实例属性
self.sex='男'
def move(self):#实例方法
print('部分')
pass
pass
#创建一个对象
m=Person()
m.move()
print("{}的年龄是:{},性别是{}".format(m.name,m.age,m.sex))
实例方法:在类的内部,使用def关键字来定义,,第一个参数默认是self【名字标识可以是其他的名字,但这个位置必须被占用】
实例方法是归于类的实例所有
实例属性:定义在方法里面使用self引用的属性
__ init __
class people:
def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age
pass
def hobby(self,food):
print(self.name+'爱'+food)
m=people('小明','男','12')
print(m.name,m.sex,m.age)
print(m.hobby('美女'))
总结__init__
python自带的内置函数,具有特殊的函数,使用双下划线包起来的【魔术方法】
是一个初始化的方法,用来定义实例属性和初始化数据,在创建对象的时候自动调用
利用传参的机制可以让我们定义功能更加强大且方便
self
self和对象指向同一内存地址,可以认为self就是对象的引用
魔术方法
在python中,有一些内置好的特定的方法,方法名为“__ xxx __ ”,在进行特定的操作时会自动被调用,这些方法称之为魔术方法。
常见的有:
__ init __ :初始化一个类,在创建实例对象为其赋值时使用
__ str __ :在将对象转换成字符串str(对象)测试的时候,打印对象的信息
__ new __ :创建并返回一个实例对象,调用一次就会得到一个对象
__ class __ :获得已知对象的类(对象__class__)
__ del __:对象在程序运行结束后进行对象销毁的时候调用这个方法,来释放资源
__ str __
class people:
def __init__(self,name,sex,age,food):
self.name=name
self.sex=sex
self.age=age
self.food=food
pass
def hobby(self):
print(self.name+'爱'+self.food)
pass
pass
m=people('小明','男','12','美女')
print(m)
print(m.hobby())
没用__str__则只可以通过m.hobby()调用
class people:
def __init__(self,name,sex,age,food):
self.name=name
self.sex=sex
self.age=age
self.food=food
pass
def hobby(self,food):
print(self.name+'爱'+self.food)
pass
def __str__(self):
'''
打印对象 自定义对象
:return:
'''
return "%s 最爱的是 %s,性别是%s,年龄是%s"%(self.name,self.food,self.sex,self.age)
pass
m=people('小明','男','12','美女')
print(m)
__ new __
class people:
def __init__(self,name,sex,age,food):
self.name=name
self.sex=sex
self.age=age
self.food=food
print("------执行__init__------")
pass
def hobby(self,food):
print(self.name+'爱'+self.food)
pass
def __str__(self):
return "%s 最爱的是 %s,性别是%s,年龄是%s"%(self.name,self.food,self.sex,self.age)
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法 每用一次将产生一个新的对象 cls 即class的缩写
场景:可以控制创建对象的一些属性限定 经常用来做单例模式的时候来使用
:param args:
:param kwargs:
'''
print("------执行__new__------")
return object.__new__(cls)#真正创建对象实例
#如果没有这一句将返回None
pass
m=people('小明','男','12','美女')
print(m)
__ new __ 和 __ init __函数的区别
__ new __类的实例化方法,必须要返回该实例,否则对象就创建不成功
__ init __用来做数据属性的初始化工作,也可以认为是实例的构造方法,接收类的实例self并对其进行构造
__ new __至少有一个参数是cls代表要实例化的类,此参数在实例化时有python解释器自动提供
__ new __ 函数的执行要早于 __ init __函数
__ iter __
一个类想被用于for … in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
class fib():
def __init__(self):
self.a,self.b = 0,1;
def __iter__(self):
return self
def __next__(self):
self.a,self.b = self.b,self.a + self.b
if self.a > 100:
raise StopIteration
return self.a
for i in fib():
print(i)
__ getitem __
我们可以通过__ getitem __方法来实现使一个类可以完成list相应的操作(切片、取某一个元素),至于其它list的操作同样可以通过在类中定义相关的韩函数来实现。
class fib():
def __getitem__(self, n):
if isinstance(n,int)://查询某一号元素
a,b = 1,1
for i in range(n):
a,b = b,a+b;
return a;
if isinstance(n,slice)://切片
a,b = 1,1;
L = [];
L1 = [];
stop = n.stop
start = n.start
print(start)
print(stop)
if start is None:
start = 0;
for i in range(stop):
if i >= n.start:
L1.append(i)
L.append(a)
a,b = b,a+b;
print(L1)
return L
f = fib()
print(f[5])
print(f[0:10])
__ getitem __ setitem delitem
class Person():
def __init__(self):
self.a = {'fdj':"vjdfg",'dj':"dkfh"}
def __getitem__(self, value):
return self.a[value]
def __setitem__(self, key, value):
self.a[key] = value
def __delitem__(self, key):
del self.a[key]
p = Person()
print(p.a)
p['hd'] = "dhfkd"
print(p.a)
print(p['fdj'])
p['fdj'] = 'kcgk'
print(p['fdj'])
del p['fdj']
print(p.a)
__ setitem __与 __ setattr __
注意 self.__ dict __的用法
class Person():
def __setitem__(self, key, value):
print(1)
self.__dict__[key] = value
def __setattr__(self, key, value):
print(2)
self.__dict__[key] = value
p = Person()
p.age = 1;
p['name'] = "schj"
案例——决战紫禁之巅
import time #导入时间的库
import random
class role:
def __init__(self,name,energy):
self.name=name
self.energy=energy
pass
def tong(self,enemy):
self.energy-=10
a= "%s捅了%s一刀"%(self.name,enemy.name)#注意这里的enemy.name不可以省略为enemy
print(a)#此处不可以将print换为return否则无返回值
pass
def kan(self,enemy):
self.energy-=15
a= "%s砍了%s一刀"%(self.name,enemy.name)
print(a)
pass
def medicine(self):
self.energy+=10
a= "%s吃了一颗补血药,增加十滴血"%(self.name)
print(a)
pass
def __str__(self):
return "%s还剩%s的血量"%(self.name,self.energy)
pass
z=role("孙悟空",100)
b=role("猪八戒",100)
while True:
c = random.randint(1, 6) # 1<=a<=6
if z.energy<=0 or b.energy<=0:
break
if c == 1:
z.tong(b)
print(z)
print(b)
print(c)
print("**************************")
time.sleep(1) # 暂停1s
if c == 2:
b.tong(z)
print(z)
print(b)
print(c)
print("**************************")
time.sleep(1) # 暂停1s
if c == 3:
z.kan(b)
print(z)
print(b)
print(c)
print("**************************")
time.sleep(1) # 暂停1s
if c == 4:
b.kan(z)
print(z)
print(b)
print(c)
print("**************************")
time.sleep(1) # 暂停1s
if c == 5:
z.medicine()
if z.energy >= 100:
z.energy = 100
print(z)
print(b)
print(c)
print("**************************")
time.sleep(1) # 暂停1s
if c == 6:
b.medicine()
if b.energy >= 100:
b.energy = 100
print(z)
print(b)
print(c)
print("**************************")
time.sleep(1) # 暂停1s
pass
if z.energy<=0:
print("孙悟空输了")
else:
print("猪八戒输了")
print("对战结束")