1.类的定义的创建实例
1.1类的定义
#伪代码
class ():
注意:()并不是必须的!!参见本节【说明】
实例:定义空类
class Student(): #定义没有参数的类,()可省略
pass
【说明】类定义时,没有参数的类,()可省略,但是建议养成加上()的习惯,当类定义有参数时,参数不是空白就表示该类为继承类。
1.2实例创建
#伪代码
= ()
【说明】一般来说,大多实例创建几乎都是无参数的。
小实例:一个简单的实例创建
class Student(): #定义一个没有参数的类
pass #空类
if __name__ == "__main__":
XYC = Student() #实例创建,必须有()
print(XYC) #输出为内存空间
输出:
【说明】创建实例时, = ()中的()不能省略,省略了相当于是给类起了一个别名,与函数赋值给变量那里的一致。
2.类属性定义及其访问
2.1定义类时指定类属性
直接在定义类时指定该类的属性,即类属性。
#伪代码
class ():
=
实例:类属性的定义
class Student:
name = "XYC" #定义了名为name的类属性
2.2类属性的访问
方式1:
#伪代码
.
方式2:
#伪代码
.
实例:保存的文件名为class01.py(后续要用)
class Student:
name = "XYC" #定义了名为name的类属性
if __name__ == "__main__":
#方式1:
print(Student.name) #通过"类名.属性名"访问属性:
#方式2:
XYC = Student() #实例创建
print(XYC.name)
输出:
XYC
XYC
保存class01.py后,在Python交互式下操作:
>>> import class01 #导入模块,运行后可不导入
>>> stu1 = Student() #创建实例
>>> stu1.name #访问实例属性
'XYC'
>>> Student.name = "xieyingcheng" #重新赋值类属性
>>> stu1.name #再次访问实例属性
'xieyingcheng' #实例的类属性已经改变
>>> Student.name
'xieyingcheng'
>>> stu1.name = "xyc" #重新赋值实例属性
>>> stu1.name
'xyc'
>>> Student.name
'xieyingcheng' #实例属性无法修改类属性
【说明】>>> import class01 #导入模块,运行后可不导入
对此行语句不了解或不明白的,请参考后续:导入类
2.3为对象动态绑定新属性
Python作为一种动态语言,除了可以在定义类时指定类属性外,还可以动态地为已经创建的对象绑定新的属性。
保存class01.py后,在Python交互式下操作:
>>> import class01 #class01作为模块使用
>>> stu1 = Student() #实例创建
>>> stu2 = Student() #实例创建
>>> Student.age = 23 #通过类增加类属性
>>> stu1.age #之前建的实例包含新增的类属性
23
>>> stu2.age #之前建的实例包含新增的类属性
23
>>> stu1.sex = "male" #通过实例增加实例属性
>>> stu2.sex #其他实例不包括该实例属性
Traceback (most recent call last):
File "", line 1, in
stu2.sex
AttributeError: 'Student' object has no attribute 'sex'
总结1:通过. = 新增的类属性,所有该类的实例都包含该新类属性,与实例创建先后顺序无关;
总结2:通过. = 新增的类属性,仅该实例拥有,其他所有实例均无此新属性。
3.类的方法
类中的方法分为两类:普通方法和内置方法。
①普通方法需要通过类的实例对象根据方法名调用;
②内置方法是在特定情况下由系统自动执行。
3.1普通方法的定义和调用
①普通方法的定义:使用def保留字
#伪代码
class ():
def (self, ):
【说明1】普通方法定义时,要求第一个参数需要对应调用方法时所使用的实例对象(一般命名为self,但也可以改为其他名字)。
【说明2】类中的方法本质上就是前面所学习的函数(不同点在于self),因此,类中的方法也可以有默认参数值。
②普通方法的调用:
#伪代码
.()
【说明】实例对象调用类中的普通方法时,并不需要传入self参数的值,self会自动对应调用该方法时所使用的对象。
#class02.py
class Student():
name = "XYC"
#定义一个普通方法
def SetName(self, newname):
#将self对应实例中name属性赋为newname
self.name = newname
#定义另一个普通方法
def PrintName(self):
print("姓名:%s" % self.name)
保存class02.py后,在Python交互式下操作:
>>> import class02 #导入模块,运行后可不导入
>>> stu1 = Student()
>>> stu2 = Student()
>>> stu1.SetName("Python基础学习")
>>> stu2.SetName("LiHua")
>>> stu1.PrintName()
姓名:Python基础学习
>>> stu2.PrintName()
姓名:LiHua
类的普通方法必须通过实例对象调用,而不能通过类名直接调用。
保存class02.py后,在Python交互式下操作:
>>> import class02
>>> Student.SetName()
Traceback (most recent call last):
File "", line 1, in
Student.SetName()
TypeError: SetName() missing 2 required positional arguments: 'self' and 'newname'
【解释】这是因为通过实例对象调用时会自动将该实例对象传给self,而通过类调用时则不会有这个隐含的参数传递。即:一直都会缺少一个位置参数。
3.2私有属性的定义和调用
①私有属性:是指在类内可以直接访问而在类外无法直接访问的属性。
②Python中规定,在定义类时,如果一个类属性名是以__(两个下划线)开头,则该类属性为私有属性。
③一个私有属性小实例:
#class03.py
class Student():
name = "XYC" #定义 普通属性
__id = "123456789" #定义私有属性
#定义一个普通方法
def SetInfo(self, newname, newid):
#将self对应实例中name赋为newname
self.name = newname
#将self对应实例中__id赋为newid
self.__id = newid
#定义另一个普通方法
def PrintInfo(self):
print("姓名:%s;身份证:%s" \
% (self.name, self.__id))
if __name__ == "__main__":
stu = Student()
stu.SetInfo("HH", "999888777")
stu.PrintInfo()
stu.__id
输出:姓名:HH;身份证:999888777
保存class03.py后,在Python交互式下操作:
>>> import class03 #导入模块,路径要一致
>>> stu3 = Student() #创建新的实例对象
>>> stu3.__id #尝试访问私有属性
Traceback (most recent call last):
File "", line 1, in
stu3.__id #尝试访问私有属性
AttributeError: 'Student' object has no attribute '__id'
>>> Student.__id #尝试使用"类.属性"外部访问
Traceback (most recent call last):
File "", line 1, in
Student.__id
AttributeError: type object 'Student' has no attribute '__id'
【说明】实际上,Python中并不存在无法访问的私有属性。如果我们在类中定义了一个私有属性,则在类外访问该私有属性时需要在私有属性名前加上“_类名”(一个下划线),即:
#伪代码
._
注:只有一个点号!!
保存class03.py后,在Python交互式下操作:
>>> import class03 #导入模块,路径要一致
>>> stu3 = Student() #创建新的实例对象
>>> stu3._Student__id #外部访问私有属性
'123456789'