python之面向对象

本文通过一系列实例详细介绍了Python面向对象编程的基础概念,包括类的创建、对象的实例化、方法的使用、私有属性与方法、类属性、继承、单例模式等。通过动物、车、楼房、个人信息管理系统等案例,展示了如何运用面向对象编程解决实际问题。此外,还探讨了面向对象的三大特性:封装、继承和多态,并给出了继承和单例模式的实际应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、面向对象的含义

面向对象,就行一种编程思想
类:具有相同属性或者相同行为的一类事物,就叫类;类是抽象的
对象:对象就是类的具体实列;对象是真实存在的
世界万物都是对象

二、面向对象车案列

class Car():  #首字母大写
    def run(self):
        print('车会跑')
    def music(self):
        print('车能听音乐')
mbc = Car() #创建一个面包车对象
mbc.run() #调用面包车跑的对象
mbc.music() #调用面包车听音乐的对象

三、面向对象动物案列

class DongWu():
    def jiao(self):
        print('动物会叫')
    def pao(self):
        print('动物会跑')
    def flay(self):
        print('动物会飞')
niao = DongWu()
niao.jiao()
niao.pao()
niao.flay()
ren = DongWu()
ren.flay()
ren.pao()

四、面向对象赋值属性

class Dog():
    def eat(self):
        print('吃东西')
    def sleep(self):
        print('睡觉')
hsq = Dog()
hsq.eat()
hsq.sleep()
hsq.name = '小兰'
hsq.age = 12
print(hsq.name)

lg = Dog()
lg.eat()
lg.sleep()

五、魔法方法

__init__方法会在创建的对象的时候自己执行
self指的是对象本身
_str_返回什么值 打印对象的时候就会打印什么值

class people():
    def __init__(self,name,age):  # 构造方法、魔法方法、初始化
        self.name = name
        self.age = age

    def __str__(slef):
        return slef.age

    def eat(self):
        print('吃饭')

    def sleep(self):
        print('睡觉')


hujian = people('胡见','25') #创建对象
print(hujian)
print(hujian.age)
hujian.sleep()
hujian.eat()

六、楼房案例

class lf:
    def __init__(self,name,height):
        self.name = name
        self.height = height

    def juzhu(self):
        print('房子可以居住')

    def gao(self):
        print('房子高')
pingfang = lf('平房','36米')
pingfang.juzhu()
pingfang.gao()
print(pingfang.name)
print(pingfang.height)

七、个人信息面向对象版本

class IdCard():
    def __init__(self):
        self.l = [] #装所有人的信息
    def add(self):
        d = {}
        name = input('请输入姓名:')
        age = input('请输入年龄:')
        gender = input('请输入性别:')
        d['name'] = name
        d['age'] = age
        d['gender'] = gender
        self.l.append(d)
        print(self.l)
    def find(self):
        A = False
        name = input('请输入您要查找的名字:')
        for i in self.l:
            if i.get('name') == name:
                print('姓名:{}\n年龄:{}\n性别:{}'.format(name, i.get('age'), i.get('gender')))
                A = True
                break
        if A == False:
            print('查无此人')
    def xiugai(self):
        A = False
        name = input('请输入您要修改的名字:')
        for i in self.l:
            if i.get('name') == name:
                while True:
                    print('1.修改名字')
                    print('2.修改年龄')
                    print('3.修改性别')
                    print('4.退出修改')
                    num = input('请输入您的操作序号:')
                    if num == '1':
                        i['name'] = input('请输入新的名字:')
                        print(self.l)
                    elif num == '2':
                        i['age'] = input('请输入新的年龄:')
                        print(self.l)
                    elif num == '3':
                        i['gender'] = input('请输入新的性别:')
                        print(self.l)
                    elif num == '4':
                        break
                    else:
                        print('序号有误,请重新输入')
                A = True
        if A == False:
            print('查无此人,请重新输入')
    def delete(self):
        A = False
        name = input('请输入您要删除的名字:')
        for i in self.l:
            if i.get('name') == name:
                self.l.remove(i)
                print(self.l)
                A = True
                break
        if A == False:
            print('查无此人,请重新输入')
    def chakan(self):
        print(self.l)
def main(self):
    print("欢迎登录个人信息管理系统")
    while True:
        print('1.增加信息')
        print('2.查找信息')
        print('3.修改信息')
        print('4.删除信息')
        print('5.查看所有个人信息')
        print('6.退出')
        num = input('请输入您的操作序号:')
        if num == '1':
            self.add()
        elif num == '2':
            self.find()
        elif num == '3':
            self.xiugai()
        elif num == '4':
            self.delete()
        elif num == '5':
            self.chakan()
        elif num == '6':
            break
        else:
            print('输入有误,请重新输入')

if __name__ == '__main__':
    cm = IdCard()
    cm.main()

八、士兵突击

class Gun():#枪类
    def __init__(self,name):
        self.name = name
        self.num = 0 #发子弹
    def add_bullet(self,num):
        self.num += num
    def open_fire(self,diren):
        self.num = self.num - 1
        print('向%s开火,还剩%s发'%(diren.name,self.num))
        diren.kill()
class sbl():#士兵类
    def __init__(self,name,age,Gun):
        self.name = name
        self.age = age
        self.Gun = Gun
        self.hp = 100
    def openfire(self,diren):
        if self.Gun is not None:
            self.Gun.open_fire(diren)
        else:
            print('没有枪')
    def kill(self):
        self.hp -= 10
        if self.hp<=0:
            print('挂了')
        else:
            print('还剩%s点血量'%self.hp)

ak47 = Gun('AK47')# 创建一把枪
m16 = Gun('m16')
ak47.add_bullet(50) #加50发子弹

xsd = sbl('许三多',24,ak47)
diren = sbl('敌人',21,m16)


xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火
xsd.openfire(diren) #向敌人开火

class Wq(object):
    def __init__(self,name):
        self.name = name
class Feiji(Wq):
    pass
    def open_fire(self,dapao):
        print('%s向%s开火'%(self.name,dapao.name))
class Dapao(Wq):
    pass
feiji = Feiji('飞机')
dapao = Dapao('大炮')
feiji.open_fire(dapao)

九、植物大战僵尸

class zhiwu():
    def __init__(self,name,jineng,jiage):
        self.name = name
        self.jineng = jineng
        self.jiage = jiage
        self.num = 0
    def shengchang(self,num):
        self.num +=num
        print('向日葵生产了%s阳光,剩余%s阳光'%(num,self.num))
    def sheji(self,juren):
        print('向%s射击'%(juren.name))
        juren.klii()

class jiangshi():
    def __init__(self,name):
        self.name = name
        self.hp = 100
    def klii(self):
        self.hp -=10
        if self.hp > 0:
            print('还剩%s血量'%(self.hp))
        else:
            print('挂了')
            
Xrk = zhiwu('向日葵','生产阳光',50)
Wdss = zhiwu('豌豆射手','发射子弹',100)
juren = jiangshi('巨人僵尸')
Xrk.shengchang(20)
Xrk.shengchang(20)
Xrk.shengchang(20)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)
Wdss.sheji(juren)

十、私有属性

属性和方法不能直接调用,就是私有属性

class dog():
    def __init__(self):
        self.name = '3月'
        self.__age = 12 #私有属性
    def show_age(self):
        print(self.__age)

    def set__age(self,age): #利用公有方法给私有属性赋值
        if age > 0:
            self.__age = age

    def get__age(self):
        return  self.__age

gou = dog()
# gou.name = '哈士奇'
# dog.__age = 13 #公有属性
print(gou.name)
gou.set__age(21)
print(gou.get__age())

十一、私有方法

私有方法可以避免直接被调用,也影响字类调用

class tianmao:
    def __buy(self):
        return '购买成功'
    def cheak_money(self,num):
        if num < 100:
            print('购买不了')
        else:
            return self.__buy()
t = tianmao()
print(t.cheak_money(200))
# print(t.__buy) 私有方法不能直接调用 

十二、类属性

类属性就是全局变量

class dog():
    count = 0 #类属性
    __count = 0 #私有类属性
    def __init__(self,name):
        self.name = name #实列属性
        dog.count +=1
        dog.__count += 1
        self.__age = 12 #私有实列属性
    def get_age(self):
        return  self.__age

Dog = dog('哈士奇')
print(Dog.name)
Dog = dog('哈士奇')
print(Dog.name)
Dog = dog('哈士奇')
print(Dog.name)
Dog = dog('哈士奇')
print(Dog.name)
print(dog.count)
print(dog.__count)

'''
实列属性:对象的属性
类属性:定义的属性,有全局的定义
私有实列属性:不想让外部直接访问,不想让外部访问,可以把属性定于私有的
私有类属性:不想让外部直接访问,不想让外部访问,可以把属性定于私有的
'''

十三、面向对象三大特性

面向对象三大特性

十四、继承案例

#教学老师
class teacher(object): #父类
    def __init__(self,name,age):
        self.name = name
        self.age = age
    #规定了字类所拥有的功能,具体的还是看字类
    def eat(self):
        print('可以吃饭')
    def play(self):
        print('可以教人')

class basketball_teacher(teacher): #继承父类
    def play(self):  #继承重写
        print('可以教人打篮球')
    def eat(self): #继承重写
        print('%s可以吃大米饭'%self.name)

class football_teacher(teacher):
    def eat(self): #继承重写
        print('%s可以吃炒饭'%self.name)
    def sleep(self):
        print('可以睡觉')
    def play(self): #继承重写
        print('可以教人踢足球')
laoshi = basketball_teacher('胡见',23)
laoshi.eat()
laoshi.play()

jiaolian = football_teacher('喻喻',21)
jiaolian.eat()
jiaolian.play()


#手机
class Call(object):
    def __init__(self,xinghao,color):
        self.xinghao = xinghao
        self.color = color
    def ddh(self,name):
        print('{}的{}可以{}打电话'.format(self.color,self.xinghao,name))
    def show(self):
        if isinstance(self,Huawei): #isinstance()判断一个对象是否是属于某个类,语法是 isinstance(对象,类)
            print('我的型号是%s,我的颜色是%s,我的大小是%s' % (self.xinghao, self.color, self.size))
        else:
            print('我的型号是%s,我的颜色是%s'%(self.xinghao,self.color))

class Huawei(Call):
    def __init__(self,xinghao,color,size):
        super().__init__(xinghao,color)
        self.size = size
    def movie(self):
        print('%s可以看视频'%self.xinghao)
class Pingguo(Call):
    def play_game(self):
        print('{}可以玩游戏'.format(self.xinghao))

call = Huawei('华为','亮黑色',30)
pingguo = Pingguo('苹果','白色')
call.ddh('胡豆')
call.movie()
call.show()
pingguo.ddh('喻豌豆')
pingguo.play_game()
pingguo.show()

'''
树
苹果树
桃树
香樟树
'''
class Tree(object):
    def __init__(self,name,color):
        self.name = name
        self.color = color
    def kaihua(self):
        print('{}可以开花'.format(self.name))
    def show(self):
        if isinstance(self,Apple):
            print('我的名字是%s,我的颜色是%s,我的高度是%s米'%(self.name,self.color,self.height))
        else:
            print('我的名字是%s,我的颜色是%s' % (self.name, self.color))
    def jieguo(self):
        print('树可以结果子')
class Apple(Tree):
    def __init__(self,name,color,height):
        self.height = height
        super().__init__(name,color)
class Taoshu(Apple):
    pass
    def jieguo(self):
        print('%s可以结桃子'%self.name)
class Xiangzhangshu(Tree):
    pass

apple = Apple('苹果树','绿色',23)
apple.show()
apple.jieguo()
taoshu = Taoshu('桃树','红色',41)
taoshu.show()
taoshu.kaihua()
taoshu.jieguo()
xiangzhangshu = Xiangzhangshu('香樟树',"蓝色")
xiangzhangshu.show()

十五、单列模式

不管创建多少个对象,我们在内存中只有唯一的一个对象
代码如下(示例):

class Eath(object):
    __instance = None #定义一个类的属性作判断
    def __new__(cls, name, age):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
        return  cls.__instance
a = Eath("地球",214)
b = Eath("火星",12)
print(id(a))
print(id(b))
a.age = 100
print(b.age)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值