代码运行环境基于Pycharm 24.1,python 3.12
Python面向对象概述
类和对象是面向对象程序设计的两个重要概念。
类和对象的关系即数据类型与变量的关系,根据一个类可以创建多个对象,而每个对象只能是某一个类的对象。
类规定了可以用于存储什么数据,而对象用于实际存储数据,每个对象可存储不同的数据。
类的定义和创建实例
可以直接创建新的类,也可以基于一个或多个已有的类创建新的类;
们既可以创建一个空的类,然后再动态添加属性和方法,也可以在创建类的同时设置属性和方法。
类中的属性对应前面所学习的变量(实例),而类中的方法对应前面所学习的函数。
通过类,可以把数据和操作封装在一起,从而使得程序结构更加清晰,这也就是所谓的类的封装性。
class 类名:
语句1
语句2
...
...
语句N
例:定义一个空类。
class Student: # 定义一个名字为Student的类
pass # 一个空语句,起到占位作用,表示Student类中没有任何属性和方法。
例:创建Student类对象。
Class Student:
pass
if __name__=='__main__':
stu=Student() # 创建Student类的对象,并将创建的对象赋给变量stu
print(stu) # 输出stu:<__main__.Student object at 0x000001523015BAC0>
注意:每次创建对象时,系统都会在内存中选择一块区域分配给对象,每次选择的内存通常时不一样的。因此,实际运行时会看到一个不同的stu对象地址。
类属性定义及其访问
定义类时指定类属性
class Student: # 定义Student类
name='Unknown' # 定义Student类中有一个name属性
对类属性的访问
既可以通过类名访问,也可以通过该类的对象访问。
类名.属性名
对象名.属性名
例:类属性的访问示例。
class Student: # 定义Student类
name='Unknown' # 定义Student类中有一个name属性
if __name__=='__main__':
stu1=Student() # 创建Studentl类对象stu1
stu2=Student() # 创建Studentl类对象stu2
print('第7行输出:stu1 %s,stu2 %s'%(stu1.name,stu2.name))
Student.name='未知' # 将Student的类数下name赋值为未知'
print('第9行输出:',Student.name)
print('第10行输出:stu1%s,stu2%s'%(stu1.name,stu2.name))
stu1.name='李晓明' # 将stu1的name属性赋值为'李晓明'
stu2.name='马红' # 将stu2的name属性赋值为'马红'
print('第13行输出:',Student.name)
print('第14行输出:stu1%s,stu2%s'%(stu1.name,stu2.name))
第7行输出:stu1 Unknown,stu2 Unknown
第8行输出: 未知
第10行输出:stu1未知,stu2未知
第13行输出: 未知
第14行输出:stu1李晓明,stu2马红
为对象动态绑定新属性
Python作为一种动态语言,除了可以在定义类时指定类属性外,还可以动态地为已创建的对象绑定新的属性。
例:为对象绑定新属示例。
class Student: # 定义Student类
name='Unknown' # 定义Student类中有一个name属性
if __name__=='__main__':
stu1=Student()
stu2=Student()
stu1.age=19 # 为对象stu1动态绑定新的属性age。
print('stu1姓名:%s,年龄:%d'%(stu1.name,stu1.age)) #输出姓名和年龄
stu1姓名:Unknown,年龄:19
类中普通方法定义及调用
与普通函数定义一样,类中的方法在定义时也需要时使用def关键字(也可以有默认参数值)。
类中的方法分为两种,普通方法和内置方法。
普通方法:需要通过类的实例对象根据方法名调用;
实例对象名.方法名(实参列表)
内置方法:是在特定情况下由系统自动执行
注意:类的普通方法必须通过实例对象调用,而不能通过类名直接调用。这是因为通过实例对象调用时会自动将该实例对象传给self,而通过类调用时则不会有这个隐含的参数传递。
普通方法定义和调用
第一个参数需要对应调用方法时所使用的实例对象(一般为self,但也可以改为其他名字)
class Student:
name='Unknown'
def SetName(self,newname,newid='Unknown'): # 定义类的普通方法Setname且有一个默认参数newid
self.name=newname # 将self对应实例对象中的name属性值赋为newname
def PrintName(self): # 定义类的普通方法Printname
print('姓名:%s'%self.name)
if __name__=='__main__':
stu1=Student()
stu2=Student()
stu1.SetName('李晓明') # 实例对象名.方法名(实参列表),self就是实例对象stu1,而newname='李晓明'
stu2.SetName('马红')
stu1.PrintName() # self=stu1
stu2.PrintName()
私有属性
在定义类时,如果一个类属性名是以__(两个下划线)开头,则该类属性为私有属性。
在类内可以直接访问,而在类外无法直接访问的属性。那如果需要在类外访问私有属性怎么办?私有属性名前面加上"_类名"(stu._Student__id)。
class Student:
name='未知' # 定义Student类中有一个name属性
__id='未知' # 定义Student类中有一个__id私有属性
def SetInfo(self,newname,newid): #定义SetInfo方法
self.name=newname
self.__id=newid # 将self对应实例对象的__id属性赋为newiid
def