一、类
1、定义
class 类名:
x = 0 # 数据成员
def fun01(): pass # 方法
def __init__(self):pass # 构造函数
def __del__(self):pass # 析构函数
定义一个类在形式上有点像定义一个函数。
类的4个基本成员:
1、数据成员,即变量,又称“字段”,例如:x 。一个类中数据成员的名称和个数都是任意的。
2、方法,即函数,例如:fun01()。一个类中方法的名称和个数也都是任意的。
3、构造函数,一个名称固定为__init__的函数,仅在用当前类创建对象时调用,只能有一个,可以没有。
4、析构函数,一个名称固定为__del__的函数,仅在用当前类创建的对象被删除时调用,也只能有一个,可以没有。
2、调用类的成员
(1)调用类的数据成员:类名.数据成员名。例如:
class Mycls01: x = 10; y=11
print(Mycls01.x, Mycls01.y) # 10 11
类的数据成员可以可以在定义类之后添加、修改和删除。例如:
Mycls01.a = 51; Mycls01.b = 52 # 添加类的数据成员
Mycls01.x = 81; Mycls01.y = 82 # 修改类的数据成员
print(Mycls01.a, Mycls01.b, Mycls01.x, Mycls01.y) # 81 82 51 52
del Mycls01.y ;print(Mycls01.y) # 删除类的数据成员:AttributeError: type object ‘Mycls01’ has no attribute ‘y’
(2)调用类的方法:类名.方法名。例如:
class Mycls02:
def fff01(x): print(x)
Mycls02.fff01('Hi') # Hi
类的方法可以在定义类之后添加、修改和删除。例如:
def newfun01(x): print('Good', x)
def newfun02(x): print('Good Morning', x)
Mycls02.fff01 =newfun01 # 修改类的方法
Mycls02.fff02 =newfun02 # 添加类的方法
Mycls02.fff01('A') # Good A
Mycls02.fff02('A') # Good Morning A
del Mycls02.fff01; Mycls02.fff01('A') # 删除类的方法:AttributeError: type object 'Mycls02' has no attribute 'fff01'
(3)构造函数、析构函数一般都不直接调用。
二、对象
1、创建对象。
对象只能是某个类的对象,不可能凭空定义出一个对象,也就是说,对象是类的实例,创建对象又称:类的实例化。
对象名 = 类名(参数)
对象名是任意的,类名是必须的,参数是可有可无的。同一个类是可以创建出任意多个对象的。例如:
myobj01 = Mycls(参数1)
myobj02 = Mycls(参数2)
......
对象被创建后,其内部的成员主要有两个:数据成员、方法。
2、对象的数据成员
对象的数据成员可以来自三个途径:
途径一,在创建对象时,系统会将类的数据成员“复制”一份给对象。
对象创建之后,通过对象名,可以调用、修改、删除这些从类复制来的、已经属于自己的数据成员。尽管“复制”之后,类中的数据成员和对象的数据成员会同名,但是,因为通过对象名操作的只能是对象自己的数据成员,所以对类的数据成员不会有任何影响。例如:
class Mycls04:
x = 10; y=11
def fff(x): print(x)
obj01 = Mycls04()
print(Mycls04.x, Mycls04.y) # 类的数据成员: 10 11
print(obj01.x, obj01.y) # 通过“复制”,对象得到的数据成员:10 11
obj01.x =31; obj01.y =32 # 通过对象名,修改对象的数据成员
print(Mycls04.x, Mycls04.y) # 类的数据成员不受影响: 10 11
print(obj01.x, obj01.y) # 对象的数据成员被修改:31 32
途径二,在构造函数 init() 中创建对象的数据成员,又称:初始化数据成员。
init() 是类的构造函数,它是用于初始化对象的。在一个类中,可以没有构造函数,但只要有,在依据这个类创建对象后的第一时间,这个类的构造函数就会被系统自动调用。
构造函数 init() 在定义时至少要有一个形参。第一个形参通常取名为self,但这只是惯例,实际上它的名字可任意取。在被系统自动调用,传给self的实参即是刚刚创建的新对象。创建对象语句中,类名后面的实参,则依次传给__init__()的第二、第三…个形参。例如:
class Mycls05:
def __init__(self,x,y):
print('Hi Obj')
self.a = x*10
self.b = y*100
obj02 = Mycls05(5,6) # 构造函数__init__()在创建对象后的第一时间被调用:Hi Obj
print(obj02.a, obj02.b) # 5、6 分别赋给了构造函数的第二、第三个形参:50 600
在构造函数中,“self.变量名 = 值”这样的语句,其实就是在为对象设置数据成员并赋值。在Mycls05 中,构造函数为对象创建了 a、b 两个数据成员,并进行了初始化。
途径三,在对象创建后添加新的数据成员。
class Mycls06::pass
obj03 = Mycls06()
obj03.y = 6; obj03.z = 8; print(obj03.y, obj03.z) # 添加新的对象成员y、z: 6 8
访问对象的数据成员的方法:对象名.数据成员名。例如:obj03.y 。
删除对象的数据成员可以用del语句。例如:
del obj03.z ;print( obj03.z) # 删除对象的数据成员 z :AttributeError: 'Mycls06' object has no attribute 'z'
2、对象的方法
对象依据某个类创建后,所依据这个类的所有方法对象都可能使用。相当于在创建对象时,系统将类的所有方法都“复制”了一份给新创建的对象。
这里有一个问题需要注意:通过“对象名.方法名”的方式调用从类中“复制”来的方法时,系统会自动地把当前对象作为一个实参赋值给方法的第一个形参。这就使得,如果被调用方法在定义时一个形参没有设置,系统就会报错。例如:
class Mycls07:
def fun(): print('aaa')
obj04 = Mycls07()
Mycls07.fun() # 用类名来调用,一切正常:aaa
obj04.fun() # 用对象名调用,会报错:TypeError: fun() takes 0 positional arguments but 1 was given
鉴于以上的情况,在类中定义方法时,如果要使创建的对象也能调用,就必须确保至少有一个形参。另外,在用对象名调用方法时,系统在把当前对象作为一个实参赋给第一个形参的同时,把其余的实参依次赋给第二、三…个形参。例如:
class Mycls08:
def fun(x,y=8,z=9): print(x, y)
obj05 = Mycls08()
Mycls08.fun(55,66) # 用类名调用时,第1、2实参给了第1、2形参:55 66 9
obj05.fun(55,66) # 用对象名调用时,第1、2实参给了第2、3形参:<__main__.Mycls08 object at 0x00000000005674C0> 55 66
用“对象名.方法名”不能删除从类“复制”来的方法,例如:
del obj05.fun # 删除从类“复制”来的方法会报错:AttributeError: fun
用“对象名.方法名”可以修改从类“复制”来的方法,显然修改的只能是对象的方法,不能修改与之对应的类的方法。如果修改后的方法,对应的是在类外面新定义的函数,则,实参与形参的赋值是一一对应的。例如:
def newfun03(x,y=8,z=9): print('Very Good', x, y, z)
obj05.fun = newfun03 # 修改对象从类“复制”来的方法
Mycls08.fun(55,66) # 类的方法不会被修改:55 66 9
obj05.fun(55,66) # 在调用新的方法时,实参与形参一一对应赋值:Very Good 55 66 9
对象的方法可以添加,且新添加的对象的方法是可以删除的。例如:
def newfun04(x,y,z): print('New',x, y, z)
obj05.newfff = newfun04 # 给对象添加新的方法
obj05.newfff(77,88,99) # 实参与形参一一对应赋值:New 77 88 99
del obj05.newfff # 删除对象添加新的方法
obj05.newfff(1,1,1) # 已经删除:AttributeError: 'Mycls08' object has no attribute 'newfff'
———————————————— 本篇完 ————————————————
看完之后,麻烦您顺手点击下方 “点赞” 两个字给我点个赞吧 ^-^ , 谢谢您了。
如果您还能像我小学一年级班主任好老师那样,给我随心写上几句表扬或批评的话语,那真是感激不尽!
在我人生的道路上,有了您的鼓励和指导,我一定成长快快。