类:对一系列变量与方法的封装
创建一个类需要使用关键字 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 中可以将成员变量的定义放在构造函数内部进行定义
例如上边的例子中我们去除掉成员方法外部的成员变量定义语句,将成员变量的定义与赋值都放在了类的构造方法内部,运行并未报错
假设我们没有定义该成员方法时,对定义的学生对象进行输出:
而在定义了 字符串获取方法之后:
我们发现可以正确的输出类对象的信息
在没有定义能够实现比较大小的成员方法时候,进行值的比较发现提示了错误信息-------无法进行两个 Student 类之间的比较,这主要是因为类内部的成员变量有 name 和 age ,编译器不知道两个对象之间的比较应该按照哪一个变量值进行比较(name or age),因此需要程序员自己来实现一个比较的方式
def __lt__(self, other):
return self.age < other.age # 实现按照年龄信息进行比较
在上边我们实现了判断两个对象内容大小关系的成员方法 _lt_ ,那它能否实现两个对象之间判断小于等于(大于等于)关系呢 ? 我们来试试看
因此,引入了新的成员方法 : _le_
def __le__(self, other): # 实现小于等于(大于等于)比较
return self.age<=other.age
在没有定义判等方法之前,我们来看看编译器如何处理两个对象的判等:
在该示例中,我们期望的是对不同对象的年龄进行判等,第一个比较结果 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++ 语言在语法上有一定的区别,也有一定的类似之处,注意区分~~