Python 入门 12 —— 类 、 对象

一、类

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'

———————————————— 本篇完 ————————————————

看完之后,麻烦您顺手点击下方 “点赞” 两个字给我点个赞吧 ^-^ , 谢谢您了。

如果您还能像我小学一年级班主任好老师那样,给我随心写上几句表扬或批评的话语,那真是感激不尽!

在我人生的道路上,有了您的鼓励和指导,我一定成长快快。

发布了28 篇原创文章 · 获赞 6 · 访问量 2277

猜你喜欢

转载自blog.csdn.net/Jeff888999/article/details/103964477
今日推荐