python 面向对象--类,对象,属性,方法,魔法方法

news2024/11/24 3:56:40

1.理解面向对象思想

  • 面向过程思想: 遇到问题,分析步骤.按照步骤解决问题.(复杂,重复)

  • 面向对象思想: 遇到问题,找到能解决问题的对象去解决.(简单,复用)

2.类和对象

# 定义类的格式:
# class 类名():
#     代码
#     ......
class Student():
​
    def study(self):
        print('学生好好学习')
​
    def eat(self):
        print('学生大鱼大肉,好好吃.')
​
if __name__ == '__main__':
    #创建对象格式:
    # 对象名 = 类名()
    xiaoming = Student()
​
    #使用对象的格式:
    #对象名.函数名()
    xiaoming.eat()
    xiaoming.study()

3.self关键字

# self指的是调用该函数的对象
# 调用函数我们不需要给self传参.因为python解释器会把调用者当成参数传递给self
class Student():
​
    def study(self):
        print('学生好好学习')
​
    # 谁来调用eat()-- self就是谁.
    def eat(self):
        print(self)#<__main__.Student object at 0x00000240B39B8460>
        print(id(self))#2476914476128
        print('学生大鱼大肉,好好吃.')
​
if __name__ == '__main__':
​
    xiaoming = Student()
    print(xiaoming) #<__main__.Student object at 0x00000240B39B8460>
    print(id(xiaoming)) #2476914476128  -- id()函数时对内存地址的封装.
    xiaoming.eat()
​
    print("*"*30)
    laowang = Student()
    print(laowang)

4.添加和获取属性

  • 类的外部 操作 属性

类的外部可以给类添加属性.
class Student():
​
    def study(self):
        print('学生好好学习')
​
    # 谁来调用eat()-- self就是谁.
    def eat(self):
        print('学生大鱼大肉,好好吃.')
​
if __name__ == '__main__':
    s1 = Student()
    # 类的外部>>>添加属性
    #格式:  对象名.属性名 = 值
    s1.name = 'tom'
    print(s1.name)
​
    s1.age = 19
    print(s1.age)
​
    s2 = Student()
   # 类以外的属性.定义后方能使用.
   # print(s2.name)#AttributeError: 'Student' object has no attribute 'name'
  • 类的内部添加属性

class Student():
​
    ### add_name虽然可以在类的内部给学生对象添加实行.但是.容易忘记调用.必须自己手工调用.!!!
    def add_name(self):
        # 在类的内部--添加属性
        self.name = "小明"
​
    def study(self):
        #在类的内部--获取属性名
        print(f'{self.name}:在认真学习')
​
if __name__ == '__main__':
    s1 = Student()
    s1.add_name()# 在类的内部给对象添加了一个name属性.
​
    print(s1.name)#小明
    s1.study()

5.魔法方法init()

class Student():
​
    #__init__()方法,在创建对象时默认被调用,不需要手动调用
    def __init__(self,name,age,sex):
        # 在类的内部--添加属性
        print('__init__')
        #self.name是给对象添加属性name, = name是参数name的值赋值给=左边的变量.
        self.name = name
        self.age = age
        self.sex = sex
​
    def study(self):
        #在类的内部--获取属性名
        print(f'{self.name}:在认真学习')
​
if __name__ == '__main__':
    s1 = Student('小明',19,'男')
​
    print(s1.name)#小明
    print(s1.age)#小明
    print(s1.sex)#小明
    s1.study()

6.对象内存图

 

7.魔法方法__str()

"""
汽车类:
    属性:
        颜色-color:
        品牌-brand:
        价格-price:
    行为:
        run()
        stop()
        speed()
"""
​
class Car():
    #属性:
    def __init__(self,color,brand,price):
        self.color = color
        self.brand = brand
        self.price = price
    #行为:
    def run(self):
        print("汽车在飞驰")
​
    def stop(self):
        print('刹车要及时')
​
    def speed(self):
        print('超车要加速')
​
    #魔法行为
    def __str__(self):
        return f"{self.color}的{self.brand}售价{self.price}"
​
if __name__ == '__main__':
    c = Car('红色','法拉利',199900)
    # 默认情况下.打印一个对象,打印的就是该对象的地址值.
    print(c)#<__main__.Car object at 0x000001DC37EF65E0>
​
    #python定义的列表类.它的对象就不打印地址值.而是打印元素.
    my_list = [1,2,3]
    print(my_list)#[1, 2, 3]
​
    # 我想打印汽车对象的时候.打印汽车的信息.
    C2 = Car('黑色',"BYD",290000) #黑色的BYD售价290000
    print(C2)

8.魔法方法__repr()

class Car():
    #属性:
    def __init__(self,color,brand,price):
        self.color = color
        self.brand = brand
        self.price = price
    #行为:
    def run(self):
        print("汽车在飞驰")
​
    def stop(self):
        print('刹车要及时')
​
    def speed(self):
        print('超车要加速')
​
    #魔法行为
    def __str__(self):
        return f"{self.color}的{self.brand}售价{self.price}"
​
    #魔法方法__repr__
    def __repr__(self):
        return f"{self.color}的,{self.brand},售价:{self.price}"
​
​
if __name__ == '__main__':
    #制造3辆汽车
    c1 = Car('红色','法拉利',1990000)
    c2 = Car('黑色','BYD',290000)
    c3 = Car('白色','WULING',29000)
​
    #打包发货
    cars = [c1,c2,c3]
​
    #发货前检查--失败:
    # "[<__main__.Car object at 0x000001DB2A918460>,
    # <__main__.Car object at 0x000001DB2A9569A0>,
    # <__main__.Car object at 0x000001DB2A9D85B0>]"
    print(cars)
​
    #定义 __repe__之后:
    #[红色的,法拉利,售价:1990000, 黑色的,BYD,售价:290000, 白色的,WULING,售价:29000]

9.魔法方法__del()

class Car():
    #属性:
    def __init__(self,color,brand,price):
        self.color = color
        self.brand = brand
        self.price = price
    #行为:
    def run(self):
        print("汽车在飞驰")
​
    def stop(self):
        print('刹车要及时')
​
    def speed(self):
        print('超车要加速')
​
    # 魔法行为
    def __str__(self):
        return f"{self.color}的{self.brand}售价{self.price}"
​
    def __del__(self):
        print(f'被删除的对象是{self}')
​
if __name__ == '__main__':
    #创建对象
    c1 = Car('红色','法拉利',1990000)
​
    # 删除对象
    del c1 # 被删除的对象是红色的法拉利售价1990000

10.面向对象方式创建容器对象

  • 字面值创建

    • 列表: list1 = [1,2,3]

    • 字典: dict1 = {'name':'tom',"age":20}

    • 元组: tuple1 = (1,2,3)

    • 集合: set1 = {1,2,3}

  • 面向对象

    • 容器类型( [容器] )

    • 此方式可以实现不同容器之间的转换.

#字面值方式: (1,2,3)
tuple1 = (1,2,3)
print(type(tuple1),tuple1)
​
# 面向对象方式
tuple2 = tuple()
print(type(tuple2),tuple2)
​
list1 = list()
list1.append(123)
list1.append('hello')
print(type(list1),list1)
​
# 使用面向对象方式.可以对数据进行转换.
tuple3 = tuple(list1)
print(tuple3)
​
list2 = list("12323")
print(list2)
​
#集合可以自动去除重复--存取无序
set1 = set(list2)
print(set1)

11.面向对象案例1

# 地瓜的属性
#     被烤的时间
#     地瓜的状态
#     添加的调料
# 地瓜的方法
#     被烤
#         用户根据意愿设定每次烤地瓜的时间
#         判断地瓜被烤的总时间是在哪个区间,修改地瓜状态
#     添加调料
#         用户根据意愿设定添加的调料
#         将用户添加的调料存储
# 显示对象信息
class Sweetpotato():
​
    def __init__(self):
        '''
        对象属性初始化:
        :param time: 被烤时间  0
        :param state: 当前状态   '生的'
        :param flavour: 已将撒上的调料 []
        '''
        self.time = 0
        self.state = '生的'
        self.flavour = []
​
    #烤地瓜方法
    def cooking(self,time):
        self.time += time
        if 0 <= self.time < 3:
            self.state = '生的'
        elif 3 <= self.time < 5:
            self.state = '半生不熟'
        elif 5 <= self.time < 8:
            self.state = '熟了'
        elif self.time >= 8:
            self.state = '烤糊了'
​
    def add_flavour(self,flavour):
        #添加用户撒入的调料
        self.flavour.append(flavour)
​
    def __str__(self):
        return f'地瓜已经被烤{self.time}分钟,当前状态{self.state},已撒上调料{self.flavour}'
​
if __name__ == '__main__':
    s1 = Sweetpotato()# 创建地瓜
    print(s1)
​
    s1.cooking(7)# 调用地瓜的被烤方法
​
    s1.add_flavour('孜然')
    s1.add_flavour('辣椒')
    s1.add_flavour('食盐')
​
    print(s1)#地瓜已经被烤7分钟,当前状态熟了,已撒上调料['孜然', '辣椒', '食盐']

12.面向对象案例 2

# 房子类
#     实例属性
#         房子地理位置
#         房子占地面积
#         房子剩余面积
#         房子内家具列表
#     实例方法
#         容纳家具
#     显示房屋信息
# 家具类
#     家具名称
#     家具占地面积
class Sweetpotato():
​
    def __init__(self):
        '''
        对象属性初始化:
        :param time: 被烤时间  0
        :param state: 当前状态   '生的'
        :param flavour: 已将撒上的调料 []
        '''
        self.time = 0
        self.state = '生的'
        self.flavour = []
​
    #烤地瓜方法
    def cooking(self,time):
        self.time += time
        if 0 <= self.time < 3:
            self.state = '生的'
        elif 3 <= self.time < 5:
            self.state = '半生不熟'
        elif 5 <= self.time < 8:
            self.state = '熟了'
        elif self.time >= 8:
            self.state = '烤糊了'
​
    def add_flavour(self,flavour):
        #添加用户撒入的调料
        self.flavour.append(flavour)
​
    def __str__(self):
        return f'地瓜已经被烤{self.time}分钟,当前状态{self.state},已撒上调料{self.flavour}'
​
if __name__ == '__main__':
    s1 = Sweetpotato()# 创建地瓜
    print(s1)
​
    s1.cooking(7)# 调用地瓜的被烤方法
​
    s1.add_flavour('孜然')
    s1.add_flavour('辣椒')
    s1.add_flavour('食盐')
​
    print(s1)#地瓜已经被烤7分钟,当前状态熟了,已撒上调料['孜然', '辣椒', '食盐']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/553012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【连续介质力学】Voigt符号

Voigt符号 一个对称二阶张量有6个独立的分量&#xff0c;那么就可以将他表示成列向量的形式&#xff1a; 这种表示方式为Voigt符号&#xff0c;也可以将二阶张量表示成&#xff1a; 正如minor对称的四阶张量C&#xff0c; C i j k l C j i k l C i j l k C j i l k C_{ij…

hive函数

函数 Hive的函数分为两大类∶内置函数(Built-in Functions )、用户定义函数UDF (User-Defined Functions ) . 内置函数可分为︰数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等; 用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF。 UDF:普通函…

一图看懂 charset_normalizer 模块:字符集规范化,真正的第一个通用字符集检测器,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 charset_normalizer 模块&#xff1a;字符集规范化&#xff0c;真正的第一个通用字符集检测器&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&a…

AI人工智能决策树分类器的原理、优缺点、应用场景和实现方法

决策树分类器&#xff08;Decision Tree Classifier&#xff09;是一种常用的机器学习算法&#xff0c;它被广泛应用于分类和回归问题中。在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;决策树分类器是一种简单而有效的算法&…

DETR3D 论文学习

1. 解决了什么问题&#xff1f; 对于低成本自动驾驶系统&#xff0c;仅凭视觉信息进行 3D 目标检测是非常有挑战性的。目前的多相机 3D 目标检测方法有两类&#xff0c;一类直接对单目图像做预测&#xff0c;没有考虑 3D 场景的结构或传感器配置。这类方法需要多步后处理&…

tcpdump 抓包和记录、tshark 过滤抓包

目录 tcpdump 一、包名 二、可用参数 tcpdump -nn tcpdump -nn -i 网卡名 —— 指定显示的网卡 tcpdump -nn -i 网卡名 port 端口名 —— 指定显示的端口 tcpdump -nn -i 网卡名 not port 端口名 —— 排除指定的端口不显示 tcpdump -nn -i …

JavaWeb15 - web 应用常用功能 -文件上传下载

1. 基本介绍 文件的上传和下载&#xff0c;是常见的功能。后面项目就使用了文件上传下载。如果是传输大文件&#xff0c;一般用专门工具或者插件文件上传下载需要使用到两个包 , 需要导入说明: 2. 文件上传 2.1 文件上传的基本原理 ● 文件上传原理示意图, 一图胜千言 …

进程调度策略

1 先进先出 FIFO 2 最短任务优先 SJF https://blog.51cto.com/u_13064014/5079546?btotalstatistic

机器学习和大数据:如何利用机器学习算法分析和预测大数据

第一章&#xff1a;引言 近年来&#xff0c;随着科技的迅速发展和数据的爆炸式增长&#xff0c;大数据已经成为我们生活中无法忽视的一部分。大数据不仅包含着海量的信息&#xff0c;而且蕴含着无数的商机和挑战。然而&#xff0c;如何从这些海量的数据中提取有价值的信息并做…

【CANN训练营0基础赢满分秘籍】昇腾AI入门课(PyTorch)

1 昇腾AI全栈架构 昇腾计算产业是基于昇腾系列处理器和基础软件构睫的全栈Al计算基础设施&#xff0e;行业应用及服务&#xff0c;包括昇腾系列处理器、Atlas系列硬件、CANN (Compute Architecture for Neural Networks&#xff0c;异构计算架构》、Al计算框架、应用使能、全流…

LeetCode_Day4 | 好有难度的一个环形链表啊(在最后)!

LeetCode_链表 24. 两两交换链表中的节点1.题目描述2.虚拟头节点法1.思路2.代码实现 3.递归法1.思路2.代码实现 19. 删除链表的倒数第n个节点1.题目描述2.思路&#xff1a;双指针法3.代码实现 面试题 02.07. 链表相交1.题目描述2.思路3.代码实现 142. 环形链表 II1. 题目描述2.…

【SNAT和DNAT的原理与应用】

目录 一、SNAT原理与应用1、SNAT概述2、SNAT的应用环境3、进行SNAT转换后的情况 二、SNAT实验三、DNAT1、DNAT策略概述2、DNAT 实验 一、SNAT原理与应用 1、SNAT概述 SNAT 应用环境&#xff1a;局域网主机共享单个公网IP地址接入Internet&#xff08;私有不能早Internet中正常…

网络知识点之-静态路由

静态路由&#xff08;英语&#xff1a;Static routing&#xff09;是一种路由的方式&#xff0c;路由项&#xff08;routing entry&#xff09;由手动配置&#xff0c;而非动态决定。与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变&#xff0c;即使网络状况已…

进程控制(总)

目录 进程创建 fork函数初识&#xff1a; 写时拷贝&#xff1a; fork常规用法&#xff1a; fork调用失败的原因&#xff1a; 进程终止 进程退出场景&#xff1a; 进程常见退出方法&#xff1a; _exit函数 exit函数 return退出&#xff1a; 进程等待 进程等待的必…

UE5实现模型压平效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 蓝图实现2.3 闪面问题与压平精度3.参考资料1.实现目标 模型压平功能是GIS系统中的一个常用功能,可以用于模型的替换,数据的对比等。本文在UE5中通过修改材质的方式实现,实现模型压平的功能,包括常规建模的StaticMesh,以及C…

2023年网络安全竞赛——Windows操作系统渗透测试Server2124

任务五:Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2124(关闭链接)服务器场景操作系统:Windows(版本不详)通过本地PC中渗透测试平台Kali对服务器场景Server2124进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为Fla…

【C++ 学习 ⑥】- C++ 动态内存管理详解

目录 一、new 表达式和 delete 表达式的工作机理 二、operator new 和 operator delete 函数 2.1 - 标准库定义 2.2 - 重载 三、定位 new 表达式 四、常见面试题 4.1 - malloc/free 和 new/delete 的区别 4.2 - 内存泄漏 在 C 中&#xff0c;new 和 delete 既是关键字&…

Linux系统c语言socket实现TCP通信

socket通信用到的函数 int socket( int af, int type, int protocol); af&#xff1a;一个地址描述。仅支持AF_INET格式&#xff0c;也就是说ARPA Internet地址格式。 type&#xff1a;指定socket类型。新套接口的类型描述类型&#xff0c;如TCP&#xff08;SOCK_STREAM&#…

IMX6ULL裸机篇之DDR3参数配置分析

一. DDR3L 初始化简介 上一篇博文进行了 DDR参数的初始化&#xff0c;通过一个 execl表进行配置&#xff0c;生成脚本文件。文章网址如下&#xff1a; IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 本文对 DDR的参数配置进行详细的说明。即对 "Register Configur…

前端026_菜单模块_新增功能

菜单模块_新增功能 1、需求分析2、新增组件实现3、列表引用新增组件4、关闭弹出窗口5、校验表单数据6、提交表单数据6.1、Mock 添加新增模拟接口6.2、Api 调用接口6.3、测试新增功能1、需求分析 菜单管理中有两处有 新增 按钮: 条件区域的是新增一级菜单,传递的参数是0。列表…