【Python基础】第十五篇 | 面向对象之初级篇

面向对象

基本的介绍
面向对象是一个编程思想(写代码的套路)

编程思想:
1.面向过程
2.面向对象
以上两种都属于写代码的套路(方法),最终目的都是为了将代码书写出来,只不过过程和思考方法不太一样

面向过程:
关注的是 具体步骤的实现,所有的功能都自己书写
亲力亲为
定义一个个函数,最终按照顺序调用函数

面向对象:
关注的是结果,谁(对象)能帮我做这件事
偷懒
找一个对象(),让对象去做

类和对象

面向对象的核心思想:找一个对象去帮我们处理事情
在程序代码中 对象是由 类 创建的
类和对象,是面向对象编程思想非常重要的两个概念

:抽象的概念,对多个 特征和行为相同或者相似事物的统称
泛指的(指代多个,而不是具体的一个)
对象:具体存在的一个事物,看得见摸得着的
特指的(指代一个)

举例
苹果 —> 类
红苹果 —> 类
张三嘴例正在吃的那个苹果 —>对象

类的组成

  • 1.类名(给这过个事物起一个名字,在代码中,满足大驼峰命名法(每个单词的首字母大写))
  • 2.属性(事物的特征,即有什么,一般文字中的名词)
  • 3.方法(事物的行为,即做什么事,一般是动词)

类的抽象
类的抽象,其实就是找到 类的类名,属性,方法

需求1:
小明今年18岁,身高1.75,每天早上跑完步,回去吃东西
小美今年17岁,身高1.65,小美不跑步,小美喜欢吃东西

类名:人类(Person,People)
属性:名字(name), 年龄(age),身高(height)
方法:跑步(run),吃东西(eat)

需求2:
一只黄颜色的狗狗叫大黄
看见生人汪汪叫
看见家人摇尾巴

类名:狗类(Dog)
属性:颜色(color)
名字(name)
方法:汪汪叫(bark) 摇尾巴(shake)

面向代码的步骤

1.定义类,在定义类之前先设计类
2.创建对象,使用第一步定义的类创建对象
3.通过对象调用方法

面向对象基本代码的书写

1.定义类
先定义简单的类,不包含属性,在Python中定义类需要使用关键字class
方法:方法的本质是在类中定义的函数,只不过,第一个参数是self

class 类名:
    # 在缩进中书写的内容,都是类中的代码
    def 方法名(self): # 就是一个方法
        pass

2.创建对象
创建对象是使用 类名() 进行创建,即

类名() # 创建一个对象,这个对象在后续不能使用
# 创建的对象想要在后续的代码中继续使用,需要使用一个变量,将这个对象保存起来
变量 = 类名() # 这个变量中保存的是对象的地址,一般可以称为一个变量的对象
# 一个类可以创建多个独享,只要出现 类名() 就是创建一个对象,每个对象的地址是不一样的。

3.调用方法

对象.方法名()

如:列表.sort()
列表.append()

#1.定义类

# 需求:小猫爱吃鱼,小猫要喝水
# 类名:猫类(Cat)
# 属性:暂无
# 方法:吃鱼(eat),喝水(drink)
class Cat:
    def eat(self):
        print("小猫爱吃鱼....")
    def drink(self):
        print("小猫要喝水....")

#2.创建对象

blue_cat = Cat()
#3.通过对象调用类中的方法
blue_cat.eat()
blue_cat.drink()

self的说明

class Cat:
    def eat(self):
        print("小猫爱吃鱼....")

1.从函数的语法上将,self是形参,就可以是任意的变量名,只不过我们习惯性将这个形参写作self
2.self是普通的形参,但是在调用的时候没有传递实参值,原因是python解释器在执行代码的时候,自动的将调用这个方法的对象传递给了self,即self的本质是对象
3.验证,只需要确定通过哪个对象调用,对象和引用和self引用是一致的
4.self 是函数中的局部变量,直接穿点的对象是全局变量

class Cat:
    def eat(self):
        print(f'{id(self)},self') #35583648,self
        print("小猫爱吃鱼....")
blue_cat = Cat()
print(f'{id(blue_cat)},blue_cat') #35583648,blue_cat
blue_cat.eat()
  • 对象的属性操作

添加属性
对象.属性名 = 属性值

类内部添加
在内部方法中,self是对象
self.属性名= 属性值
在类中添加属性一般写作 __init__方法中

类外部添加
对象.属性名= 属性值 # 一般不使用

  • 获取属性

对象.属性名
类内部
在内部方法中,self是对象
self.属性名
类外部
对象.属性名 #一般很少使用
‘’’

# 类外部添加属性名
class Cat:
    def eat(self):
        print(f'{id(self)},self') #35583648,self
        print(f"小猫{self.name}爱吃鱼....")

blue_cat = Cat()
print(f'{id(blue_cat)},blue_cat') #35583648,blue_cat
blue_cat.name="蓝猫"
blue_cat.eat()

black_cat = Cat()
print(f'{id(black_cat)},black_cat')
black_cat.name = '黑猫'
black_cat.eat()

私有和公有

1.在python中定义的方法和属性,可以添加访问控制权限(即在什么地方可以使用这个属性和方法)
2.访问控制权限分为两种,公有权限,私有权限
3.公有权限

直接书写的方法和属性,都是公有的
公有的方法和属性,看可以在任意地方访问和使用

  1. 私有权限

在 类内部,属性名或者方法名,前边加上两个__,这个属性或者方法,就是私有的
私有的方法和属性,只能在当前类的内部使用
5.什么时候定义私有
某个属性或者方法,不详在类外部被访问和使用,就将其定义为私有即可
测试中,一般不怎么使用,直接公有即可
开发中,会根据需求文档,确定什么作为私有

# 案例
'''
定义一个Person类,属性name ,age(私有)
'''
class Person:
    def __init__(self,name,age):
        self.name = name  #姓名
        # self.age = age    #公有 年龄
        self.__age = age  #私有 年龄
    def __str__(self):
        return f'名字:{self.name},年龄:{self.__age}'
xm = Person('小明',18)
print(xm)
# xm.age = 20 
# print(xm)

魔法方法

python 中有一类方法,以两个下划线开头,量噶尔下划线结尾,并且在满足某个条件的情况下,会自动调用,这类方法称为魔法方法

  • __init__方法

1.什么情况下自动调用

创建对象之后会自动调用

2.有什么用,用在哪

1.给对象添加属性的,(初始化方法,构造方法)
2.某些代码,在每次创建对象之后,都要执行,就可以将这行代码写在__init__方法中

3.书写的注意事项

1.不要写错了
2.如果init方法中,存在除了self以外的参数,在创建对此昂的时候必须传参

# 猫类 属性 name,age ,show_info(输出属性信息)
# __init__ 不带参数
class Cat:
    # 定义添加属性的方法
    def __init__(self): # 这个方法是创建对象之后调用
        self.name = '蓝猫' # 给对象添加name属性
        self.age=2 # 给独享添加age属性
    
    def show_info(self):
        print(f'小猫的名字是:{self.name},年龄是:{self.age}')

# 创建对象,不要在自己类缩进中创建
bluecat = Cat()
bluecat.show_info()

# __init__带参数
class Cat:
    def __init__(self,name,age) :
        self.name =name
        self.age = age
    def show_info(self):
        print(f'小猫的名字是:{self.name},年龄是:{self.age}')

black_cat = Cat('黑猫',5)
black_cat.show_info()
  • __str__方法

1.什么情况下自动调用

使用print(对象) 打印对象的时候,会自动调用

2.有什么用,用在哪

1.在这个方法中一般书写对象的 属性信息的,即打印对象的时候想要查看什么信息,在这个方法中进行定义的 如果雷总没有定义
2.__str__方法,print(对象),默认输出对象的引用地址

3.书写的注意事项

这个方法必须返回 一个字符串

class Cat:
    def __init__(self,name,age) :
        self.name =name # 给对象添加name属性
        self.age = age  # 给对象添加age属性
    def __str__(self):
        # 方法必须返回一个字符串,只要是字符串就行
        return  f'小猫的名字是:{self.name},年龄是:{self.age}'
blue_cat =  Cat('蓝猫',2)
print(blue_cat)
black_cat = Cat('黑猫',3)
print(black_cat)
  • __del__方法

__init__方法,创建对象之后,会自动调用 (构造方法)
__del__方法,对象被删除销毁时,自动调用的(遗言,处理后事)(析构方法) 调用场景 1.程序代码运行结束,所有对象都被销毁
直接使用del删除对象(如果对象有多个名字(多个对象引用一个对象),需要把所有的对象都删除才行)

class Demo:
    def __init__(self,name):
        self.name = name
        print(f'我是__init__,{self.name}被调用了')
    def __del__(self):
        print(f'{self.name} 没了,给它处理后事...')
Demo('a')
a= Demo('a')
del a # 删除 销毁 对象
b = Demo('b')
print('代码运行结束')

案例
需求1:
1.小明体重75.0公斤
2.小明每次跑步会减肥0.5公斤
3.小明每次吃东西体重增加1公斤
类名:人类 Person
属性:姓名 name 体重 weight
方法:跑步 run 吃东西 eat
添加属性 init
打印方法 str

class Person:
    def __init__(self,name,weight) :
        self.name = name
        self.weight = weight
    def __str__(self):
        return f'姓名:{self.name},体重:{self.weight}公斤'
    def eat(self):
        print(f'{self.name}大餐一顿, 体重增加了')
        self.weight += 1
    def run(self):
        print(f'{self.name}跑步5Km,体重减少了')
        self.weight-=0.5

per = Person('小明',75.0)
print(per)
per.run()
print(per)
per.eat()
print(per)

需求2:
1.房子(House) 有户型,总面积和家具名称列表
新房子没有任何的家具
2.家具(HouseItem) 有名字和占地面积,其中
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 4 平米
餐桌(table) 占地 1.5 平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
剩余面积
1.在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等
2.当调用add_item方法,向房间添加家具是,让剩余面积-=家具面积
类名:房子类 House
属性:户型 name ,总面积 area ,
剩余面积 free_area = total_are _家具面积
家具名称列表 item_list=[]
方法:initstr
添加家具方法 add_item
def add_item(self,item): #item家具对象
先判断房子的剩余面积和总面积的关系
修改房子的剩余面积
修改房子的家具名称列表

类名:家具类 HouseItem
属性:户型 name ,总面积 area
方法:init,str

class HouseItem:
    """家具类"""
    def __init__(self,name,area):
        """添加属性的方法"""
        self.name=name # 家具面积
        self.area=area # 占地面积面积
    def __str__(self):
        return f'{self.name}, 占地{self.area}平米'



class House:
    def __init__(self,name,area):
        self.name=name # 户型
        self.total_area=area # 总面积
        self.free_area =area# 剩余面积
        self.item_list=[] # 家具列表
    def add_item(self,item): # item 表示的家具的对象
        # 判断房子的剩余面积(self.free_area)和家具的占地面积(item.area)
        # self.表示的是房子对象,缺少一个家具对象使用传参解决
        if self.free_area>item.area:
            # 添加家具 --> 向列表中添加数据
            self.item_list.append(item.name)
            # 修改剩余面积
            self.free_area-=item.area
            print(f'{item.name}添加成功')
        else:
            print(f'剩余面积不足,{item.name}添加成功')
    def __str__(self):
        return f"户型:{self.name},总面积:{self.total_area}平米,剩余面积:{self.free_area}平米,家具列表:{self.item_list}"

# 创建家具对象
bed = HouseItem('席梦思',4)
chest = HouseItem('衣柜',4)
table = HouseItem('餐桌',1.5)   

# 创建房子对象
house = House('三室一厅',150)
# 添加床
house.add_item(bed)
print(house)
# 添加衣柜
house.add_item(chest)
print(house)
# 添加桌子
house.add_item(table)
print(house)

案例3
需求:某Web项目登录页面包含:用户名,密码,验证码,登录按钮和登录的方法
书写代码实现以上功能,登录方法使用print输出即可
类名:LoginPage
属性:用户名 username ,密码 password,验证码 code ,登录按钮 button
方法:登录(login) init

class LoginPage:
    def __init__(self,username,password,code,button):
        self.username = username
        self.password = password
        self.code = code
        self.btn = button 
    def login(self):
        print(f'1.输入用户名:{self.username}')
        print(f'2.输入密码:{self.password}')
        print(f'3.输入验证码:{self.code}')
        print(f'4.点击按钮:{self.btn}')

login = LoginPage('admin','123456','8888','登录')
login.login()
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值