7面向对象基础(上)

面向对象的介绍

面向对象编程: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("对战结束")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值