Python面向对象(二)(构造方法、其它内置方法)

news2024/11/17 3:29:27

构造方法

属性(成员变量)的赋值

class Student:
    name = None     # 姓名
    age = None      # 年龄
    tel = None      # 手机号
    
    
stu1 = Student()
stu1.name = "张三"
stu1.age = 20
stu1.tel = "1212121211"

stu2 = Student()
stu2.name = "张四"
stu2.age = 20
stu2.tel = "1212121211"

 上面代码中,为对象的属性赋值需要依次进行,略显繁琐。

有没有更加高效的方式,能够一行代码就完成呢?

思考:Student()

这个括号,能否像函数(方法)那样,通过传参的形式对属性赋值呢?

可以,需要使用构造方法:__init__()

构造方法

Python类可以使用:__init__()方法,称之为构造方法。

  • 可以实现: 在创建类对象(构造类)的时候,会自动执行。
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用
class Student:
    # 可以省略
    name = None  # 姓名
    age = None  # 年龄
    tel = None  # 手机号

    def __init__(self, name, age, tel): # 构建类时传入的参数会自动提供给__init__方法
        self.name = name                # 构建类的时侯__init__方法会自动执行
        self.age = age
        self.tel = tel
        print("Student类创建了一个对象")


stu3 = Student("李四", 30, "1212563")
print(stu3.name, stu3.age, stu3.tel)


结果:
Student类创建了一个对象
李四 30 1212563

 构造方法注意事项

  • 重要的事情说三遍,构造方法名称:__init__   __init__   __init__ , 千万不要忘记init前后都有2个下划线
  • 构造方法也是成员方法,不要忘记在参数列表中提供:self
  • 在构造方法内定义成员变量,需要使用self关键字
 def __init__(self, name, age, tel): # 构建类时传入的参数会自动提供给__init__方法
        self.name = name                # 构建类的时侯__init__方法会自动执行
        self.age = age
        self.tel = tel
        print("Student类创建了一个对象")

          这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示

总结:

1. 构造方法的名称是:

__init__,注意init前后的2个下划线符号

2. 构造方法的作用:

构建类对象的时候会自动运行

构建类对象的传参会传递给构造方法,借此特性可以给成员变量赋值

3. 注意事项:

构造方法不要忘记self关键字

在方法内使用成员变量需要使用self

练习:

学生信息录入

开学了有一批学生信息需要录入系统,请设计一个类,记录学生的:

姓名、年龄、地址,这3类信息

请实现:

  • 通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入
  • 输入完成后,使用print语句,完成信息的输出

 

 


# 创建构造方法
class Student:
    def __init__(self, i, name, age, address):
        self.name = name
        self.age = age
        self.address = address
        print(f"学生{i}信息录入完成,信息为:【学生姓名:{name},年龄:{age},地址:{address}】")


# 通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入
for i in range(1, 11):
    print(f"当前录入第{i}位学生信息,总共录入10位学生信息")
    name = input(f"请输入学生姓名:")
    age = input(f"请输入学生年龄:")
    address = input(f"请输入学生地址:")
    Student(i, name, age, address)
    i += 1

将学生存入字典

格式:

{ID{" 学生姓名:": name, "年龄:": age, "址地:": address},......,ID{" 学生姓名:": name, "年龄:": age, "址地:": address}}

# 创建构造方法
class Student:
    dict = {}

    def __init__(self, i, name: str, age: int, address: str):
        self.name = name
        self.age = age
        self.address = address
        self.dict[i] = {" 学生姓名:": name, "年龄:": age, "址地:": address}
        print(f"学生{i}信息录入完成,信息为:【学生姓名:{name},年龄:{age},地址:{address}】")
        print(f"学生信息:{self.dict}")


# 通过for循环,配合input输入语句,并使用构造方法,完成学生信息的键盘录入
for i in range(1, 11):
    print(f"当前录入第{i}位学生信息,总共录入10位学生信息")
    name = input(f"请输入学生姓名:")
    age = input(f"请输入学生年龄:")
    address = input(f"请输入学生地址:")
    Student(i, name, age, address)
    i += 1

其它内置方法

魔术方法

上文学习的__init__ 构造方法,是Python类内置的方法之一。 这些内置的类方法,各自有各自特殊的功能,这些内置方法我们称之为:魔术方法

 魔术方法非常多  

常用魔法方法

__str__ 字符串方法

# __str__ 字符串方法
class Student:
    def __init__(self, name, age):
        self.name = name
        self.agge = age


stu = Student("张三", 99)
print(stu)          # 结果:<__main__.Student object at 0x0000020E35E48550>
print(str(stu))     # 结果:<__main__.Student object at 0x0000020E35E48550>

 当类对象需要被转换为字符串之时,会输出如上结果(内存地址)

内存地址没有多大作用,我们可以通过__str__方法,控制类转换为字符串的行为。

# __str__ 字符串方法
# 当类对象需要被转换为字符串之时,会输出如上结果(内存地址)
# 内存地址没有多大作用,我们可以通过__str__方法,控制类转换为字符串的行为。
class Student:
    """
    方法名:__str__
    返回值:字符串
    内容:自行定义
    """
    def __init__(self, name, age):
        self.name = name
        self.agge = age

    def __str__(self):
        return f"student类对象,name={self.name},age= {self.agge}"


stu = Student("张三", 99)
print(stu)          # 结果:student类对象,name=张三,age= 99
print(str(stu))     # 结果:student类对象,name=张三,age= 99

 __lt__ 小于符号比较方法

 直接对2个对象进行比较是不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号 和 大于符号 2种比较

# __it__ 字符串方法
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        """
        方法名:__lt__
        传入参数:other,另一个类对象
        返回值:True 或 False
        内容:自行定义

        比较大于符号的魔术方法是:__gt__
        不过,实现了__lt__,__gt__就没必要实现了

        """
        return self.age < other.age


stu1 = Student("张三", 99)
stu2 = Student("李四", 52)
print(stu1 < stu2)  # 结果:False
print(stu1 > stu2)  # 结果:True

 __le__ 小于等于比较符号方法

魔术方法:__le__可用于:<=、>=两种比较运算符上。

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __le__(self, other):
        """
        方法名:__le__
        传入参数:other,另一个类对象
        返回值:True 或 False
        内容:自行定义


        >=符号实现的魔术方法是:__ge__
        不过,实现了__le__,__ge__就没必要实现了
        """
        return self.age <= other.age


stu1 = Student("张三", 99)
stu2 = Student("李四", 52)
print(stu1 <= stu2)  # 结果:False
print(stu1 >= stu2)  # 结果:True

 __eq__,比较运算符实现方法

 

# __eq__ 小于等于比较符号方法
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        """
        方法名:__eq__
        传入参数:other,另一个类对象
        返回值:True 或 False
        内容:自行定义
        """
        return self.age == other.age


stu1 = Student("张三", 99)
stu2 = Student("李四", 52)
print(stu1 == stu2)  # 结果:False
  •  不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果。
  • 实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了。

总结:

方法

功能

__init__

构造方法,可用于创建类对象的时候设置初始化行为

__str__

用于实现类对象转字符串的行为

__lt__

用于2个类对象进行小于或大于比较

__le__

用于2个类对象进行小于等于或大于等于比较

__eq__

用于2个类对象进行相等比较

魔术方法索引
二元操作符:

+    object.__add__(self, other)
-    object.__sub__(self, other)
*    object.__mul__(self, other)
//    object.__floordiv__(self, other)
/    object.__div__(self, other)
%    object.__mod__(self, other)
**    object.__pow__(self, other[, modulo])
<<    object.__lshift__(self, other)
>>    object.__rshift__(self, other)
&    object.__and__(self, other)
^    object.__xor__(self, other)
|    object.__or__(self, other)

扩展二元操作符: 

+=    object.__iadd__(self, other)
-=    object.__isub__(self, other)
*=    object.__imul__(self, other)
/=    object.__idiv__(self, other)
//=    object.__ifloordiv__(self, other)
%=    object.__imod__(self, other)
**=    object.__ipow__(self, other[, modulo])
<<=    object.__ilshift__(self, other)
>>=    object.__irshift__(self, other)
&=    object.__iand__(self, other)
^=    object.__ixor__(self, other)
|=    object.__ior__(self, other)

 一元操作符:

-    object.__neg__(self)
+    object.__pos__(self)
abs()    object.__abs__(self)
~    object.__invert__(self)
complex()    object.__complex__(self)
int()    object.__int__(self)
long()    object.__long__(self)
float()    object.__float__(self)
oct()    object.__oct__(self)
hex()    object.__hex__(self)
round()    object.__round__(self, n)
floor()    object__floor__(self)
ceil()    object.__ceil__(self)
trunc()    object.__trunc__(self)

 比较函数:

<    object.__lt__(self, other)
<=    object.__le__(self, other)
==    object.__eq__(self, other)
!=    object.__ne__(self, other)
>=    object.__ge__(self, other)
>    object.__gt__(self, other)

 类的表示、输出:

str()    object.__str__(self) 
repr()    object.__repr__(self)
len()    object.__len__(self)
hash()    object.__hash__(self) 
bool()    object.__nonzero__(self) 
dir()    object.__dir__(self)
sys.getsizeof()    object.__sizeof__(self)

 类容器:

len()    object.__len__(self)
self[key]    object.__getitem__(self, key)
self[key] = value    object.__setitem__(self, key, value)
del[key] object.__delitem__(self, key)
iter()    object.__iter__(self)
reversed()    object.__reversed__(self)
in操作    object.__contains__(self, item)
字典key不存在时    object.__missing__(self, key)
 

链接:

引用(Python中最全魔术方法整理)

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

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

相关文章

Pytorch气温预测实战

数据集 数据有8个特征&#xff0c;一个标签值 自变量因变量yearactual:当天的真实最高温度monthdayweek:星期几temp_1:昨天的最高温度temp_2:前天的最高温度值average:在历史中&#xff0c;每年这一天的平均最高温度friend:朋友猜测的温度 year,month,day,week,temp_2,temp_…

【Linux】HTTPS协议是如何保证数据安全的

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录 &#x1f449;基础概念…

【Linux】进程篇Ⅰ:进程信息、进程状态、环境变量、进程地址空间

文章目录 一、概述二、查看进程信息1. 系统文件夹 /proc2. 用户级工具 ps3. getpid() 函数&#xff1a;查看进程 PID4. 用 kill 杀进程5. 进程优先级 二、进程状态分析0. 1. R (running) 运行状态2. S (sleeping) 休眠状态3. D (disk sleep) 不可中断的休眠状态4. T (stopped) …

【数据结构】顺序表(SeqList)(增、删、查、改)详解

一、顺序表的概念和结构 1、顺序表的概念&#xff1a; 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 2、顺序表的结构&#xff1a; &#xff08;1&#xff09;静态顺序表&#xff1a;使…

Redis Cluster 在Spring中遇到的问题

Redis集群配置可能会在运行时更改。可以添加新节点&#xff0c;可以更改特定插槽的主节点。还有可能因为master宕机或网络抖动等原因&#xff0c;引起了主从切换。 无法感知集群槽位变化 SpringBoot2.x 开始默认使用的 Redis 客户端由 Jedis 变成了 Lettuce&#xff0c;但是当…

忽略nan值,沿指定轴计算标准(偏)差numpy.nanstd()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 沿指定轴方向 计算标准(偏)差 numpy.nanstd() [太阳]选择题 import numpy as np a np.array([[1,2],[np.nan,3]]) print("【显示】a ") print(a) print("【执行】np.std(a)&qu…

QT项目代码去UI界面常用开发步骤

QT项目代码去UI界面常用开发步骤 因项目开发需求&#xff0c;领导要求整个QT项目中不要用UI方式来实现界面&#xff0c;这样能保障程序运行稳定性以及代码的逻辑和可读性,先记录具体操作步骤如下&#xff1a; 1、首先我们通过拖控件的方式来实现界面的设计效果&#xff0c…

ARM汇编基本变量的定义和使用

一、ARM汇编中基本变量是什么? 数字变量: GBLA LCLA SETA 逻辑变量:GBLL LCLL SETL 字符串:GBLS LCLS SETLS 注意需要TAB键定义变量和行首改变值 二、使用步骤 1.引入库 代码如下(示例): GBLA led_num Reset_Handler PROCEXPORT Reset_Handler [WEA…

HCIP BGP综合实验

题目 1、AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24该地址不能在任何协议中宣告&#xff1b; 2、AS3中存在两个环回&#xff0c;一个地址为192.168.2.0/24该地址不能在任何协议中宣告&#xff0c;最终要求这两个环回可以互相通讯&#xff1b; 3、AS间的骨干链路I…

Vue3搭建启动

Vue3搭建&启动 一、创建项目二、启动项目三、配置项目1、添加编辑器配置文件2、配置别名3、处理sass/scss4、处理tsx 四、添加Eslint 一、创建项目 npm create vite 1.project-name 输入项目名vue3-vite 2.select a framework 选择框架 3.select a variant 选择语言 二、启…

idea 安装 插件jrebel 报错LS client not configured.

这个报错找了好久&#xff0c;有博主说版本不对&#xff0c;我脑子没反应过来以为是随便换一个低版本的就行&#xff0c;没想到只能是2022.4.1 这个版本才行 一定要用jrebel 2022.4.1的插件版本&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 插件下载地址&…

网络面试合集

传输层的数据结构是什么&#xff1f; 就是在问他的协议格式&#xff1a;UDP&TCP 2.1.1三次握手 通信前&#xff0c;要先建立连接&#xff0c;确保双方都是在线&#xff0c;具有数据收发的能力。 2.1.2四次挥手 通信结束后&#xff0c;会有一个断开连接的过程&#xff0…

❤️创意网页:绚丽粒子雨动画

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

Codeforces Round 889 (Div. 2) 题解

晚上睡不着就来总结一下叭~&#xff08;OoO&#xff09; 赛后榜(希望不要被Hack...Orz) 终榜&#xff01;&#xff01;&#xff01; 瞬间的辉煌(呜呜呜~) 先不放图了。。怕被dalaoHack...呜呜呜~ 总结 7.29半夜比赛&#xff0c;本来是不想打的&#xff0c;感觉最近做的题太多…

Manjaro KDE 22.1.3vmware无法复制文件

Wayland 是 X11 的现代替代品&#xff0c;几十年来 X11 一直是 Linux 上的默认窗口系统。 Wayland 是一种通信协议&#xff0c;定义 X Window 显示服务器和客户端应用程序之间的消息传递。 软件还不兼容 使用X11即可

JavaScript中的switch语句

switch语句和if语句一样&#xff0c;同样是运用于条件循环中&#xff1b; 下面例子我们用switch实现 例如如果今天是周一就学习HTML&#xff0c;周二学习CSS和JavaScript&#xff0c;周三学习vue&#xff0c;周四&#xff0c;周五学习node.js&#xff0c;周六周日快乐玩耍&…

微服务项目,maven无法加载其他服务依赖

微服务项目&#xff0c;导入了工具类工程&#xff0c;但是一直报错&#xff0c;没有该类&#xff0c; 检查maven 这里的Maven的版本与idea版本不匹配可能是导致依赖加载失败的最重要原因 检查maven配置&#xff0c;我这是原来的maven&#xff0c;home 修改之后,就不报错了

39.密码长度改变图片模糊

密码长度改变图片模糊 html部分 <div class"bg"></div> <div class"container"><h1>Image Password Strength</h1><h3>Change the password to see the effect</h3><div class"email" style&quo…

Mybatis-Flex 比 MyBatis-Plus更轻量,高性能

一、Mybatis-Flex是什么&#xff1f; Mybatis-Flex 是一个优雅的 Mybatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper^亮点 帮助我们极大的减少了 SQL 编写的工作的同时…

MQTT服务器详细介绍:连接物联网的通信枢纽

随着物联网技术的不断发展&#xff0c;MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议作为一种轻量级、可靠、灵活的通信协议&#xff0c;被广泛应用于物联网领域。在MQTT系统中&#xff0c;MQTT服务器扮演着重要的角色&#xff0c;作为连接物联网设备和…