【python】类与对象

类:对一系列变量与方法的封装

类的定义

创建一个类需要使用关键字 class,例如创建一个学生类,其中要包含学生的姓名、学号、性别、年龄四个信息:


class Student:
    Id=None   # None 表示初始信息为空值
    name=None
    age=None
    gender=None
    

对象

创建一个类对象也就是对类实现实例化:

stu1=Student()  # 创建一个 Student 类对象
# 定义一个 Student 类
class Student:
    Id=None  # 默认定义成员初始信息为空 None
    name=None
    age=None
    gender=None

stu1=Student()  # 创建一个类对象
# 对类对象的各个成员进行实例化
stu1.name="lisa"
stu1.age=19
stu1.gender="女"
stu1.Id=1001
print(stu1.Id,stu1.name,stu1.age,stu1.gender)

在这里插入图片描述

类中成员

在类内部定义的变量成为类的成员变量,类内定义的函数方法称为类的成员方法

class Student:
    Id=None
    name=None
    age=None
    gender=None


    def GetStudent(self):
        print(self.Id,self.name,self.age,self.gender)

stu1=Student()  # 创建一个类对象
stu1.name="lisa"
stu1.age=19
stu1.gender="女"
stu1.Id=1001

stu1.GetStudent()   
# 对象.成员方法--------即可在类外调用该类的成员方法


在这里插入图片描述

我们可以发现,在类内定义的成员方法含有一个默认的参数 self ,这就相当于C++类中成员函数内部隐含的 *this 指针,同样代表的是调用该成员方法的对象自身,通过这个默认的参数,我们可以获取到该类中所有的成员

类的构造方法

在 C++ 中类的构造方法名必须与类名同名,但在 python 中可不是这样的哦~

python 中构造方法名称为 : _init_

class Student:
    # name=None
    # age=None
    # tel=None

    def __init__(self,name,age,tel):  # 类内的构造方法
        self.name=name           # 既有赋值功能也有定义功能,因此上边的成员定义可以省略
        self.age=age
        self.tel=tel
        print('Student 类创建了一个对象')

stu=Student('seven',32,'13803803401')
print(stu.name,stu.age,stu.tel)


在这里插入图片描述

这里需要注意的是:

C++ 中只有在类中定义了成员变量,则根据访问权限相应的在类内或者类外访问到已经定义好的成员变量,但是在 python 中可以将成员变量的定义放在构造函数内部进行定义
例如上边的例子中我们去除掉成员方法外部的成员变量定义语句,将成员变量的定义与赋值都放在了类的构造方法内部,运行并未报错

类的成员方法–魔法函数

获取字符串方法:_str_

假设我们没有定义该成员方法时,对定义的学生对象进行输出:

在这里插入图片描述

而在定义了 字符串获取方法之后:
我们发现可以正确的输出类对象的信息

在这里插入图片描述

实现小于(大于)方法:_lt_

在没有定义能够实现比较大小的成员方法时候,进行值的比较发现提示了错误信息-------无法进行两个 Student 类之间的比较,这主要是因为类内部的成员变量有 name 和 age ,编译器不知道两个对象之间的比较应该按照哪一个变量值进行比较(name or age),因此需要程序员自己来实现一个比较的方式
在这里插入图片描述

    def __lt__(self, other):
        return self.age < other.age   # 实现按照年龄信息进行比较

在这里插入图片描述

实现小于等于(大于等于)方法:_le_

在上边我们实现了判断两个对象内容大小关系的成员方法 _lt_ ,那它能否实现两个对象之间判断小于等于(大于等于)关系呢 ? 我们来试试看

在这里插入图片描述

因此,引入了新的成员方法 : _le_

    def __le__(self, other):  # 实现小于等于(大于等于)比较
        return self.age<=other.age

在这里插入图片描述

实现判等方法:_eq_

在没有定义判等方法之前,我们来看看编译器如何处理两个对象的判等:

在这里插入图片描述

在该示例中,我们期望的是对不同对象的年龄进行判等,第一个比较结果 False 显然是正确的,因为 stu1 与 stu2 的年龄显然不相等;但是第二个比较结果怎么也是 False ? 比较的是 stu3 与 stu4 的年龄,而两个值都是 18 ,怎么不相等嘞?

这是因为编译器默认比较的是两个类对象的内存地址空间,显然内存地址空间是不相同的,结果返回 False

定义判等方法: _eq_

    def __eq__(self, other):
        return self.age==other.age   # 实现判等

在这里插入图片描述

显然这次的输出结果是正确的

但是此处输出的 stu1、stu2、stu3、stu4 的结果怎么不是我们想要看到的对象内容信息呢?

小伙伴们是不是忘记了我们之前介绍的字符串方法呀? _str_

类中私有成员

学习了上边介绍的一系列类的成员方法之后,大家是不是都有一个疑惑:为什么所有的成员方法都加了两个 下划线 ,而我们在学习函数的时候并没有说定义函数名的时候要加下划线 ??

这主要是为了区别普通函数与类内私有成员方法的,只要函数名的前加这两个下划线,则说明该方法是属于类内部的私有成员方法;同理,类内部的私有成员变量也是有下划线的,我们来试试看吧~~

私有成员变量

私有成员在类的成员方法内是可以访问到的,类外是不可以访问到私有成员变量的

在这里插入图片描述

在这里插入图片描述

私有成员方法

在这里插入图片描述

ps:
python 语言与 C++ 语言在语法上有一定的区别,也有一定的类似之处,注意区分~~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值