python面向对象

面向对象编程

面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑
面向对象(object-oriented ;简称: OO) 至今还没有统一的概念 我这里把它定义为: 按人们 认识客观世界的系统思维方式,采用基于对象(实体) 的概念建立模型,模拟客观世界分析、设 计、实现软件的办法。
面向对象编程(Object Oriented Programming-OOP) 是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。
举例:
解决吃啤酒鸭的问题
第一种方式(面向过程):
1)养鸭子
2)鸭子长成
3)杀
4)作料
5)烹饪
6)吃
7)卒
第二种方式(面向对象):
1)找个卖啤酒鸭的人
2)给钱 交易
3)吃
4)胖6斤

类和对象

面向对象编程的2个非常重要的概念:类和对象
对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象
1.类
类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。一个类可以找到多个对象
2.对象
某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。
可以是直接使用的
3.类与对象之间的关系
类就是创建对象模板
未来的一个概念就是类
举例:区分类和对象
奔驰汽车 类
奔驰smart 类
张三的那辆奔驰smart 对象
狗 类
大黄狗 类
李四家那只大黄狗 对象
水果 类
苹果 类
红苹果 类 红富士苹果 类
我嘴里吃了一半的苹果 对象

类的构成

类(Class) 由3个部分构成
类的名称:类名
类的属性:一组数据
类的方法:允许对进行操作的方法 (行为)
举例:
狗类的设计
类名:狗(Dog)
属性:品种 、毛色、性别、名字、 腿儿的数量
方法(行为/功能):叫 、跑、咬人、吃、摇尾巴

类的抽象

拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
方法:一般名词都是类(名词提炼法)
<1> 坦克发射3颗炮弹轰掉了2架飞机
坦克–》可以抽象成 类
炮弹–》可以抽象成类
飞机-》可以抽象成类
<2> 小明在公车上牵着一条叼着热狗的狗
小明–》 人类
公车–》 交通工具类
热狗–》 食物类
狗–》 狗类

定义一个类

简单Demo:

class Cat:
    #属性

    
    #方法,定义方法时,必须写上self
    def eat(self):
        print("猫在吃鱼----")
        
    def drink(self):
        print("猫在喝可乐----")
    
    def introduce(self):
        print("%s的年龄是%d"%(self.name,self.age))
           
#创建一个对象
tom = Cat()
#给tom指向的对象添加2个属性
tom.name ="汤姆"
tom.age=40
#调用tom指向的对象中的方法
tom.eat()
tom.drink()
tom.introduce()

#获取属性的第一种方式
#print("%s的年龄是%d"%(tom.name,tom.age))
lanmao=Cat()
lanmao.name="蓝猫"
lanmao.age=40
lanmao.introduce()

self指向调用的变量,谁调用,self指向谁
所谓的self,可以理解为自己
可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思
某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可

__init__方法 (两个下划线)

init()方法,在创建一个对象时默认被调用,不需要手动调用
init(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)
init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去

class Cat:
    """定义了一个Cat类"""
    #初始化对象
    def __init__(self,new_name,new_age):
        self.name=new_name
        self.age=new_age
    #方法,定义方法时,必须写上self
    def eat(self):
        print("猫在吃鱼----")
        
    def drink(self):
        print("猫在喝可乐----")
    
    def introduce(self):
        print("%s的年龄是%d"%(self.name,self.age))
           
#创建一个对象
tom = Cat("汤姆",40)
#调用tom指向的对象中的方法
tom.eat()
tom.drink()
tom.introduce()

lanmao=Cat("蓝猫",40)
lanmao.introduce()

在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据

class Cat:
    """定义了一个Cat类"""
    #初始化对象
    def __init__(self,new_name,new_age):
        self.name=new_name
        self.age=new_age
    
    def  __str__(self):
        return "%s的年龄是:%d"%(self.name,self.age)
    
    #方法,定义方法时,必须写上self
    def eat(self):
        print("猫在吃鱼----")
    
    def drink(self):
        print("猫在喝可乐----")
    
    def introduce(self):
        print("%s的年龄是%d"%(self.name,self.age))


#创建一个对象
tom = Cat("汤姆",40)
lanmao=Cat("蓝猫",40)
print(tom)
print(lanmao)
汤姆的年龄是:40
蓝猫的年龄是:40

应用一:烤地瓜

class SweetPotato:
    def __init__(self):
        self.cookedString = "生的"
        self.cookedLevel = 0
        self.condiments=[]
    
    def __str__(self):
        return "地瓜状态:%s(%d),添加的作料有%s"%(self.cookedString,self.cookedLevel,str(self.condiments))
                
    def cook(self,cooked_time):
        self.cookedLevel+=cooked_time
        if self.cookedLevel>=0 and self.cookedLevel<3:
            self.cookedString="生的"
        elif self.cookedLevel>=3 and self.cookedLevel<5:
            self.cookedString="半生不熟"
        elif self.cookedLevel>=5 and self.cookedLevel<8:
            self.cookedString="熟了"
        elif self.cookedLevel>8:
            self.cookedString="烤糊了" 
        
        
    def addCondiments(self,item):
        self.condiments.append(item)
        
        
digua=SweetPotato()
print(digua)
#开始烤地瓜
digua.cook(1)
print(digua)
digua.addCondiments("大蒜")
digua.cook(1)
print(digua)
digua.cook(1)
digua.addCondiments("番茄酱")
print(digua)
digua.addCondiments("孜然")
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)
digua.cook(1)
print(digua)

应用二:存放家具

class Home:
    def __init__(self,new_area,new_info,new_addr):
        self.area=new_area
        self.info=new_info
        self.addr=new_addr
        self.left_area=new_area
        self.contains=[]
    def __str__(self):
        msg ="房子的总面积是%d,可用面积是%d,户型是%s,地址是%s"%(self.area,self.left_area,self.info,self.addr)
        msg += "当前房子里的物品有%s"%(str(self.contains))
        return msg
    
    
    def add_item(self,item):
        self.left_area -= item.area
        self.contains.append(item.name)
        

class Bed:
    def __init__(self,new_name,new_area):
        self.name=new_name
        self.area=new_area
    
    def __str__(self):
        return "%s占用的面积是%d"%(self.name,self.area)
    
fangzi=Home(129,"三室一厅","北京市 朝阳区 长安街 666号")
print(fangzi)

bed1=Bed("席梦思",4)
print(bed1)

fangzi.add_item(bed1)
print(fangzi)

bed2=Bed("三人床",6)
fangzi.add_item(bed2)
print(fangzi)

如果一个对象与另外一个对象有一定的关系,那么一个对象可用是另外一个对象的属性

应用二改进

class Home:
    def __init__(self,new_area,new_info,new_addr):
        self.area=new_area
        self.info=new_info
        self.addr=new_addr
        self.left_area=new_area
        self.contains=[]
    def __str__(self):
        msg ="房子的总面积是%d,可用面积是%d,户型是%s,地址是%s"%(self.area,self.left_area,self.info,self.addr)
        msg += "当前房子里的物品有%s"%(str(self.contains))
        return msg
       
    def add_item(self,item):
#        self.left_area -= item.area
#        self.contains.append(item.name)
        self.left_area -= item.get_area()
        self.contains.append(item.get_name())
        
class Bed:
    def __init__(self,new_name,new_area):
        self.name=new_name
        self.area=new_area
    
    def __str__(self):
        return "%s占用的面积是%d"%(self.name,self.area)
    def get_area(self):
        return self.area
    
    def get_name(self):
        return self.name
      
fangzi=Home(129,"三室一厅","北京市 朝阳区 长安街 666号")
print(fangzi)

bed1=Bed("席梦思",4)
print(bed1)

fangzi.add_item(bed1)
print(fangzi)

bed2=Bed("三人床",6)
fangzi.add_item(bed2)
print(fangzi)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值