首页 > 编程语言 >十天学会Python——第6天:面向对象

十天学会Python——第6天:面向对象

时间:2024-07-16 20:29:09浏览次数:13  
标签:__ Python self class 面向对象 十天 print 学员 def

1 面向对象

1.1 类和对象(用类创建对象)

类的语法

class 类名():
    执行的代码

对象的语法

对象名 = 类名()
class Washer(): 	# 定义类
    def wash(self):
    	print("可以洗衣服")
        print(self)		# 返回结果是跟下面gree的地址一样
        
gree1 = Washer()		# 创建对象1
gree2 = Washer()		# 创建对象2

print(gree1)		# 返回结果是:对象gree的地址
gree1.wash()		# 返回结果是:可以洗衣服,此时wash()叫做实例方法/对象方法

注意:

  • self:表示调用该函数的对象
  • 一个类可以任意创建多个对象

对象属性的获取与添加

类外面添加对象属性:对象名.属性名 = 值

类外面获取对象属性:对象名.属性名

gree1.width = 100
print(f'洗衣机的宽度是:{gree1.width}')

类内部获取对象属性:self.属性名

class Washer():
    def wash(self):
    	print("可以洗衣服")
        print(f'gree洗衣机的宽度是{self.widtf}')		# 返回结果是:gree洗衣机的宽度是500
        
gree = Washer()		# 创建对象
gree.width = 500	#添加实例属性

1.2 魔法方法

魔法方法:有特殊功能的函数,语法是:__xx__

1 __init__(),作用是初始化对象

class Washer(): 	# 定义类
    def __init__(self):
    	self.width = 500
    def print_info(self):	# 类里面调用实例属性
    	print(f'洗衣机宽度是{self.width}')
gree = Washer()
gree.print_info()

注意:

  • __init__()方法,在创建一个对象时默认被调用,不需要手动调用
  • __init__(self)的 self 参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去

2 带参数的__init__():一个类创建多个对象,并对不同对象设置不同的初始化属性

class Washer():
    def __init__(self,width,heigth):
    	self.width = width
        self.heigth = height
    def print_info(self):
    	print(f'洗衣机宽度是{self.width}',f'洗衣机宽度是{self.heigth}')

gree1 = Washer(10,20)
gree1.print_info()
gree2 = Washer(100,200)
gree2.print_info()

3 __str__:使用print输出对象的时候,打印在这个方法中return的数据

class Washer(): 	
    def __init__(self,width,heigth):
    	self.width = width
        self.heigth = height
    def __str__(self):	
    	rentun '这是格力洗衣机'

gree = Washer(10,20)
print(gree)		# 此时返回的是:这是格力洗衣机

4 __del__:删除对象,python解释器会默认调用__del__方法

class Washer(): 	
    def __init__(self,width,heigth):
    	self.width = width
        self.heigth = height
    def __del__(self):	
    	print(f'{self}对象已经被删除')

gree = Washer(10,20)
del gree		# 删除 gree 对象

案例1:烤地瓜

class SweetPotato():
    def __init__(self):
        self.cook_time = 0			# 被烤的时间
        self.cook_static = "生的"		# 地瓜的状态
        self.condiments = []		# 调料列表
    def cook(self,time):		# 烤地瓜的方法
        """烤地瓜的方法"""
        self.cook_time += time
        if 0 <= self.cook_time < 3
        self.cook_static = '生的'
        elif 3 <= self.cook_time < 5
        self.cook_static = '半生不熟'
        elif 5 <= self.cook_time < 8
        self.cook_static = '熟了'
        else self.cook_time >= 8:
            self.cook_static = '烤糊了'
    def cook(self,time):		# 添加调料的方法
        """添加调料的方法"""
        self.condiments.append(condiment)
        if 0 <= self.cook_time < 3
    def __str__(self):		# 用于输出对象状态
        return f'这个地瓜考了{self.cook_time}分钟,状态是{self.cook_static},\n
        调料有{self.cook_condiments}'
    
# 创建对象,测试实例属性和实例方法
digua = SweetPotato()
print(digua)
digua.cook(2)
digua.add_condiments('酱油')
print(digua)

案例2:搬家具

class Furniture():		# 定义家居类
    def __init__(self,name,area):
        self.time = name		# 家具的名字
        self.area = area		# 家具的占地面积
class Home():		# 定义房子类
    def __init__(self,address,area):
        self.address = address		# 地理位置
        self.area = area		# 房屋面积
        self.free.area = area	# 房屋剩余面积
        self.furniture = []		# 家具列表
    def __str__(self):		# 用于输出对象状态
        return f'房子坐落于{self.address},占地面积是{self.area},\n
        剩余面积{self.free_area},家居有{self.furniture}'
    def add_funiture(self,item):	# 容纳家具
        if self.free_area >= item.area:
            self.furniture.append(ite,.name)
            self.free_area -= item.area
        else:
            print('家具太大了,剩余面积不足,无法容纳')

# 创建对象,测试实例属性和实例方法
bed = Funiture('双人床',6)
jia = Home('北京',1200)
print(jia)
jia.add_furniture(bed)
print(jia)

2 继承

2.1 认识继承

继承:多个类之间的所属关系,子类默认继承父类的所有属性和方法

  • 所有类默认继承object类,object类是顶级类或者基类,其他子类叫做派生类
  • 继承分为单继承和多继承
# 单继承
class A(object): 	# 这个是父类
    def __init__(self):
    	self.num = 1
    def info_print(self):	
    	print(self.num)
class B(A):		# 这个是子类
    pass

result = B()
result.info_print()		# 返回结果是:1

注意:

1 当一个类具有多个父类的时候,默认使用第一个父类的同名属性和方法

2 若子类和父类具有同名属性和方法,调用的是子类的属性和方法

3 类名.__mro__:查看类的层级关系

# 多继承
class Master(object):	# 这个是父类1
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'
    def make_cake(self):
        print(f'运用{self.kongfu}做了煎饼果子')
# 创建学校类
class School(object):	# 这个是父类2
    def __init__(self):
        self.kongfu = '小明煎饼果子配方'
    def make_cake(self):
        print('f'运用了{self.kongfu}制作了煎饼果子')
class Prentice(School,Mater):	# 这个是子类
    pass
daqiu = Prentice()
print(daqiu.kongfu())
daqiu.make_cake()	# 返回结果是:运用[小明煎饼果子配方]做了煎饼果子
              
print(prentice.__mro__)

2.2 继承中子类的调用

  • 子类调用属性和方法时,可以自定义调用子类或者父类的属性和方法
  • 多层继承子类的子类也可以继承子类和父类
# 多继承
class Master(object):	# 这个是父类1
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'
    def make_cake(self):
        print(f'运用{self.kongfu}做了煎饼果子')
# 创建学校类
class School(object):	# 这个是父类2
    def __init__(self):
        self.kongfu = '小明煎饼果子配方'
    def make_cake(self):
        print('f'运用了{self.kongfu}制作了煎饼果子')
class Prentice(School,Mater):	# 这个是子类
    def __init__:
        self.kongfu = '[独创煎饼果子配方]'
    # 调用子类方法
    def make_cake(self):
        self.__init___()	# 为了保证调用的子类方法属性,需要将子类进行初始化
        print(f.'运用{self.kongfu}做了煎饼果子')
    # 调用父类方法
    def make_master_cake(self):
        Master.__init__(self)
        Master.make_cake(self)
class Tusun(Prentice):		# 这是多层继承的使用
    pass
              
daqiu = Prentice()
daqiu.make_cake()	# 返回结果是:运用[独创煎饼果子配方]做了煎饼果子
daqiu.make_master_cake()	# 返回结果是:运用[古法煎饼果子配方]做了煎饼果子

xiaoqiu = Tusun()
xiaoqiu.make_school_cake()
  • 利用super()方法调用父类方法和属性
# 需求:一次性调用两个父类
class Master(object):
class School(Maater):
    # 如果要调用Mater里面的方法与属性,需要在此处加上super()方法
    # 后面测试案例返回结果为:运用[小明煎饼果子配方]做了煎饼果子 运用[古法煎饼果子配方]做了煎饼果子
    # super() 带参数写法:
    super(School,self).__init__()
    super(School,self).make_cake()
    # super() 无参数写法
    super().__init__
    super().make.cake()
class Prentice(School):	
    ......
    def make_old_cake(self):
        # 方法1(带参数):super(当前类名,self).函数()
        super(Prentice,self).__init__()
        super(Prentice,self).makecake()		返回结果是:运用[小明煎饼果子配方]做了煎饼果子
        # 方法2(无参数):super(当前类名,self).函数()
        super.__init__()
        super.makecake()		返回结果是:运用[小明煎饼果子配方]做了煎饼果子

2.3 私有权限

私有权限:设置某个实例属性或者实例方法,不继承给子类,在属性名和方法名前面加上两个下划线__

  • 私有属性和私有方法只能在类里面进行访问和修改
  • 一般定义函数名 get_xx 来获取私有属性,定义set_xx 来修改私有属性值
class Prentice(School,Master):
    def __init__(self):
        self.kongfu = '[独创煎饼果子配方]'
        #定义私有属性
        self.__money = 200
    def fet_money(self):	# 获取私有属性
        return self.__money
    def set_money(self):	# 修改私有属性
        self.__money = 300
    # 定义私有方法
    def __info_print(self):
        print(self.kongfu)
class Tusun(Prentice):
    pass
xiaoqiu = Tusun()
print(xiaoqiu.money)	# 此时程序报错,调用不了父类属性

2.4 多态

多态:调用不同子类对象的相同对象方法,可以产生不同的执行结果

class Dog(object):
    def work(self):		# 父类提供统一的方法
        print('指哪打哪...')
class ArmyDog(Dog):		# 继承Dog类
    def work(self):		# 子类重写父类的方法
        print('追击敌人...')
class DrugyDog(Dog):	# 继承Dog类
    def work(self):		# 子类重写父类的方法
        print('追查毒品...')
class Person(object):
    def work_with_dog(self,dog):	# 传入不用的对象,执行不同的work函数
        dog.work()

ad = ArmyDog()
dd = DrugDog()

daqiu = Person()
daqiu.work_with_dog(ad)		# 返回的结果是:追击敌人...
daqiu.work_with_dog(dd)		# 返回的结果是:直接毒品...

2.5 类属性和类方法

类属性:类对象所拥有的属性,他被该类的所有实例对象所共有

  • 类属性只能通过类对象进行修改,不能通过实例对象修改
class Dog(object):
    tooth = 10
wangcai = Dog()
xiaohei = Dog()

print(Dog.tooth)		# 返回的结果是:10
print(wangcai.tooth)	# 返回的结果是:10

Dog.tooth = 20
print(Dog.tooth)		# 返回的结果是:20

类方法:需要用装饰器@classmethod来标识其为类方法,第一个参数必须为类对象,一般以cls作为第一个参数

  • 当方法中需要使用类对象(如访问私有属性等)时,定义类方法
  • 类方法一般和类属性配合使用
class Dog(object):
    __tooth = 10
    @classmethod
    def get_tooth(cls):
        return cls.__tooth
wangcai = Dog()
print(wangcai.get_tooth())		# 返回结果是:10

2.6 静态方法

静态方法:需要通过装饰器@staticmethod来进行修饰,静态方法不需要传递类对象和实例对象

  • 静态方法可以通过实例对象和类对象进行访问
  • 当不需要进行参数传递的时候,就使用静态方法
class Dog(object):
    @staticmethod
    def info_print():
        print('这是一个狗类')
wangcai = Dog()
# 静态方法,既可以使用对象访问,又可以使用类访问
Dog.info_print()
wangcai.info_print()

3 学生管理系统(面向对象)

学员类的创建(sudent.py文件)

  • 学员信息包括:姓名、性别、手机号
  • 添加__str__魔法s方法,方便查看学员对象信息
class Student(object):
    def __init__(self,name,gender,tel):
        # 姓名、性别、手机号
        self.name = name
        self.gengder = gender
        self.tel = tel
    def __str__(self):
        return f'{self,name},{self.gender},{self.tel}'

管理系统的创建(managerSystem.py文件)

  • 管理系统循环使用,用户输入不同的功能序号执行不同功能

  • 存储数据的形式:列表存储学员对象

  • 系统功能:添加学员、删除学员、修改学员、查询学员信息、显示所有学员信息、保存学员信息

  • 步骤:定义程序入口函数(加载数据、显示功能菜单、用户输入功能序号、系统执行功能)——系统定义功能函数

from stdent import *

class StudentManager(object):
    def __init__(self):
        # 存储数据所用的列表
        self.student_list = []
    # 一、程序入口函数,启动程序后执行的函数
    def run(self):
        # 1 加载学员信息
        self.load_student()
        
        while True:
            # 2 显示功能菜单
            self.show_meu()
            # 3 用户输入功能序号
            menu_num = int(input('请输入您需要的功能序号:'))
            # 4 根据用户输入的功能序号执行不同的功能
            if menu_num == 1:		# 添加学员信息
                self.add_student()
            elif menu_num == 2:		# 删除学员信息
                self.del_student()
            elif menu_num == 3:		# 修改学员信息
                self.modefy_student()
            elif menu_num == 4:		# 查询学员信息
                self.search_student()
            elif menu_num == 5:		# 展示学员信息
                self.show_student()
            elif menu_num == 6:		# 保存学员信息
                self.saveh_student()
            elif menu_num == 7:		# 退出系统
                break
	# 二、系统功能函数
	# 1 展示功能菜单
	def show_menu():
        print('请选择如下功能:')
        print('1 添加学员信息')
        print('2 删除学员信息')
        print('3 修改学员信息')
        print('4 查询学员信息')
        print('5 显示所有学院信息')
        print('6 保存学员信息')
        print('7 退出系统')
    # 2 添加学员信息:用户输入信息---创建学员对象---将对象添加到学员列表
    def add_student(self):
        name = input('请输入您的姓名:')
        gender = input('请输入您的性别:')
        tel = input('请输入您的手机号:')
        student = Student(name,gender,tel)
        self.student_list.append(student)
        print(self.student_list)
    # 3 删除学员,删除指定姓名的学员
    def del_student(self):
        del_name = input('请输入要删除的学员姓名:')
        for i in self.student_list:
            if i,name == del_name:
                self.student_list.remove(i)
                break
            else:
                print('查无此人!')
            print(self.student_list)
    # 4 修改学员信息,用户输入学员姓名,修改学员信息
    def modefy_student(self):
        modefy_name = input('请输入您要修改的学员姓名:')
        for i in self.student_list:
            if i.name == modify_name:
                i.name == input('请输入学员姓名:')
                i.gengder == input('请输入学员性别:')
                i.tel == input('请输入学员手机号:')
                print(f'修改学员信息成功,姓名:{i.name},性别:{i.gender},手机号:{i.tel}')
                break
            else:
                print('查无此人!')
    # 5 查询学员信息
    def search_student(self):
        search_name = input('请输入您要查询的学员姓名:')
        for i in self.student_list:
            if i.name == search_name:
                print(f'查询学员信息成功,姓名:{i.name},性别:{i.gender},手机号:{i.tel}')
                break
            else:
                print('查无此人!')
    # 6 显示所有学员信息
    def show_student(slef):
        print('姓名\t性别\t手机号')
        for i in self.student_list:
            print(f'姓名:{i.name},性别:{i.gender},手机号:{i.tel}')
    # 7 保存学员信息
    def save_student(self):
        # 1 打开文件
        f = open('student.data','w')	# 打开文件
        # 文件写入数据不能是内存地址,需要把学员数据转换成列表字典数据再做存储
        new_list = [i.__dict__ for i in self.student_list]
        # 文件内数据要求为字符串类型,需将数据类型转换成字符串
        f.write(str(new_list))
        f.cloese
    # 8 加载学员信息
    def load_student(self):
        try:
            f = open('student.data','r')
        except:
            f = open('student.data','w')
        else:
            data = f.read()
            new_list = eval(data)
            # 文件中读取数据为字典类型,需转换字典为对象后再存储到学员列表
            self.student_list = [Student(i['name'],i['gender']),i['tel'] for i in new_list]
        finally:
            f.close()

主函数的创建(main.py文件)

# 1 导入managerSystem模块
from managerSysyem import *
# 2 启动学员管理系统
if __name__ == '__main__':
    student_maneger = StudentManager()
    student_manager.run()

拓展

__dict__:返回类或实例属性中对应的字典

eval:用于执行字符串形式的 Python 表达式,并返回表达式的结果

标签:__,Python,self,class,面向对象,十天,print,学员,def
From: https://blog.csdn.net/RunningJie/article/details/140475926

相关文章

  • 深入解析 Python 文件操作利器 —— shutil
    在Python编程中,文件操作是一个常见且重要的任务。无论是复制文件、移动文件还是压缩文件,Python都提供了强大的库来简化这些操作。其中,shutil库无疑是文件操作的得力助手。本文将深入探讨shutil库的各种功能,包括文件复制、内容覆盖、文件移动和重命名、文件删除、文件......
  • 【已解决】完美解决Python2操作中 文名文件乱码 问题:深入解析与策略
    【已解决】完美解决Python2操作中文名文件乱码问题:深入解析与策略亲测有效一、乱码问题的根源剖析二、优雅处理乱码问题的策略1.统一编码:2.正确处理文件路径:3.异常处理:4.环境适配:三、示例代码与最佳实践四、扩展应用与高级技巧五、总结与展望一、......
  • python 基础知识点(一)
    1.Python可以将一条长语句分成多行显示的续行符号是 \2.缩进可以用tab键实现,也可以用多个空格实现3.在Python中,使用缩进对齐来标记语句块4.在Python中,使用缩进对齐来体现代码之间的逻辑关系。5.严格的缩进可以约束程序结构,可以多层缩进6.Python中......
  • python-B树
    B树B树1.节点作为子节点2.列表作为子节点可扩展多阶B树"""B树:拥有最多子节点的节点的子节点数列称为B树的阶B树是一颗多路查找树,满足以下条件:1.定义任意非叶节点最多只有M个子节点,且M>22.根节点的子节点数为[2,M]3.除根节点以......
  • python 基础之 scrapy 当当数据一演示
    Items程序importscrapyclassDangdangItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()src=scrapy.Field()name=scrapy.Field()price=scrapy.Field()spider程序importscrapyclassDangSpider(......
  • 量化交易:如何在QMT中运行Python策略并在VSCode中高效调试?
    哈喽,大家好,我是木头左!为何选择QMT和VSCode进行量化策略开发?在量化交易的世界里,选择正确的工具与拥有优秀的策略同等重要。调用用VisualStudioCode(简称VSCode)或pycharm,方式都差不多。结合QMT的数据处理能力和VSCode的便捷调试功能,可以极大地提高量化策略的开发效率和质量。......
  • 第十一章Python 函数
    定义一个函数你可以定义一个由自己想要功能的函数,以下是简单的规则:函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。函......
  • 利用wps的com口用python实现excel转pdf
    因为最近每天都要进行表格相关的工作,每天都要整理数据导出pdf,因为导出的表格格式比较复杂,要求也比较严格,所以python导出pdf的库都满足不了需求,比较好用的又需要付费,最后摸索到了可以用应用的com口完成导出因为微软excel在导出多个sheet时比较大的sheet页并不会缩小内容而是扩大......
  • 【2024年7月新版教程】python安装
    【2024年7月新版教程】python安装python安装一、下载Windows版python安装包1.访问python官网下载页2.选择python安装版本3.下载python安装程序二、在Windows系统安装python(全自动安装教程)1.启动安装2.python安装进度3.python安装完成4.查看python安装版本......
  • python 解题 洛谷B2021到B2025
    B2021输出保留3位小数的浮点数n=float(input())n=n-0.000000000000001print('%.3f'%n)B2022输出保留12位小数的浮点数m=float(input())print('%.12f'%m)B2023空格分隔输出a=input()b=int(input())c=float(input())d=float(input())print(a,"",b,"......