这篇博文将讲述Python面向对象开发中的类与对象的概念,包括对类和对象的理解,类和对象的关系以及类和对象的创建。
加深对封装概念的理解:01_Python3中对封装的认识
1.1类和对象的概念
类(Class)是对一群具有相同特征或者行为的事物的一个统称,特征被称为是属性,行为被称为方法。类是抽象的,不能直接使用。
对象:是由类创建出来的一个具体的存在,可以直接使用,由哪一个类创建出来的对象,就拥有在哪一个类中的定义的属性和方法。
1.2类和对象的关系
- 1.类是模板,对象时根据类这个模板创建出来的。
- 2.在程序开发中,应先有类,再有对象。
- 3.类只有一个,对象可以有很多,不同的对象之间可以有不同的属性。
- 4.类中定义了什么属性和方法,对象也可以拥有这些属性和方法。
类就相当于制造飞机时的图纸,是一个模板,是负责创建对象的。对象就相当于用图纸制造的飞机,是一个具体的事物。
1.3类的设计
进行程序设计之前,首先抽象分析程序需要包含哪些类,用名词提炼法抽象出类名,再分析类中应该包含哪些属性和方法。
程序开发中需要考虑三点:
①类名:这类事物的名字,应用驼峰命名法。
②属性:这类事物具有什么样的特征。
③方法:这类事物具有什么样的行为。
类名的确定:名词提炼法,能对一类事物概括的名词。如:动物、植物等。
属性的确定:对对象特征的描述,如人的名字、年龄、性别等。
方法的确定:对象具有的行为(动词),如人会说话、吃饭、睡觉等行为。
看第一个实例:
1.Cain今年18岁,身高175,爱跑步。
2.Cary今年17岁,身高172,爱看书。
抽象分析:
类——人类
属性——名字,年龄,身高
方法——跑步,看书
程序如下:
# 创建人类
# 创建人类
class Person:
# 创建属性
def __init__(self, new_name, new_age, new_height):
self.name = new_name
self.height = new_height
self.age = new_age
print("我叫%s,今年%d岁,身高是:%d" % (self.name, self.age, self.height))
# 创建方法
def run(self):
print("我爱跑步!")
def read(self):
print("我爱看书!")
# 创建Cain对象
Cain = Person('Cain', 18, 175)
Cain.run()
# 创建Cary对象
Cary = Person('Cary', 17, 172)
Cary.read()
运行结果:
我叫Cain,今年18岁,身高是:175
我爱跑步!
我叫Cary,今年17岁,身高是:172
我爱看书!
注意:
介绍几种常用的类的内置方法
方法名 | 作用 |
---|---|
__new__ | 创建对象时,会被自动调用 |
__init__ | 对象被初始化时,会被自动调用 |
__del__ | 对象被从内存中销毁前,会被自动调用 |
__str__ | 返回对象的描述信息,print函数输出使用 |
可以用dir()方法来查看一个对象有哪些内置函数方法。
可以用id()方法来查看对象的存储地址。
2.1对象属性的初始化方法__init__
使用背景:当使用类名创建对象时,会自动执行以下操作:
- 1.为对象在内存中分配空间–创建对象
- 2.为对象的属性设置初始值–初始化方法__init__
应用说明:
来看一个例子:
- 对象的属性初始化,可以在类的内部完成,也可以在类的外部完成(不推荐,有bug)
- __init__方法是专门用来定义一个类具有哪些属性和方法。不需要调用,会自动调用初始化方法。
- 在__init__方法内部使用self.属性名 = 属性的初始值 就可以定义初始属性,在定义属性之后,再用这个类创建的对象就都会有该属性。
class Person:
def __init__(self):
# self.属性名 = 属性的初始值
self.name = 'Cain'
print("我叫%s" % self.name)
# 创建Cain对象
Cain = Person()
Cary = Person()
运行结果:
我叫Cain
我叫Cain
注意:
在类的内部的初始化方法中设置了对象的初始属性,用Person()类创建的对象都会有这个初始属性。
上面的初始值是固定的,实际开发的时候要根据需求传入属性,所以在初始化方法中应该设置形参来传入初始值。
# 创建人类
class Person:
def __init__(self,name):
self.name = name
print("我叫%s" % self.name)
# 创建Cain对象
Cain = Person('Cain')
Cary = Person('Cary')
运行结果:
我叫Cain
我叫Cary
说明:
和构造函数类似,需要用形参来代替实际参数,让代码变得更加灵活。以上代码,就是在__init__方法的参数列表加入了name这个形参,再用赋值语句self.name = name 来将传入的参数赋值给初始化属性name,这样类的初始属性就是创建对象时传入的参数了,以此类推,当一个类具有多个属性时,创建对象时,也需要传入多个属性,属性与属性之间用逗号隔开。
2.2__del__方法
使用背景:
当一个对象在内存中被销毁之前,会自动调用__del__方法来销毁对象
对象的生命周期:
看一个例子:
- 创建对象,生命周期开始
- 生命周期内,可以访问对象的属性,或让对象调用方法
- 调用__del__方法,生命周期结束
class Person:
def __init__(self,name):
self.name = name
print("我叫%s,我来啦!" % self.name)
def __del__(self):
print("我叫%s,我走啦!" % self.name)
# 创建Cain对象
Cain = Person('Cain')
print('-' * 50)
运行结果:
我叫Cain,我来啦!
--------------------------------------------------
我叫Cain,我走啦!
注意:
从以上程序可以看出,解释器在完成所有程序后,会自动调用__del__函数将对象从内存中“咔嚓”掉,所以再执行完print()语句后再执行的__del__()方法。
举个例子,你出门前需要整理仪表,料理一下卫生或者其他的事,一切搞定后,需要走出家门,并关门。在这个过程中,你在家里的时候做的一系列动作,相当于代码正常运行,当你走出去时,就算是程序结束,此时就会执行__del__方法进行关门。
感觉我是强行举例了,哈哈,这个不重要,重要的是要理解这个过程,在对象消失之前,解释会自动调用__del__函数释放对象所占的空间,如果希望对象在消失之间再做一些事情,可以在__del__方法中添加这些要做的事情,比如上面的程序,离开的时候说我走了。
# 创建人类
class Person:
def __init__(self,name):
self.name = name
print("我叫%s,我来啦!" % self.name)
def __del__(self):
print("我叫%s,我走啦!" % self.name)
# 创建Cain对象
Cain = Person('Cain')
del Cain
print('-' * 50)
运行结果:
我叫Cain,我来啦!
我叫Cain,我走啦!
--------------------------------------------------
说明:
程序提前结束了(del)对象的生命周期,对象的所占的内存提前释放了,所以类中的__del__方法也提前执行了,通过这个例子应该对__del__方法的理解更加深刻了吧。
2.3__str__方法
使用背景:
如果希望用print()输出对象变量时,能够打印自定义的内容,就需要用到__str__这个方法了,需要注意的是__str__方法返还值必须是一个字符串。
不好理解话,就看例子吧:
class Person:
def __init__(self, name):
self.name = name
"""
def __str__(self):
return ("我是一个名为:%s的人类" % self.name)
"""
# 创建Cain对象
Cain = Person('Cain')
print(Cain)
加上多行注释运行结果:
<__main__.Person object at 0x000002248C561390>
不加多行注释运行结果:
我是一个名为:Cain的人类
说明:
不用__str__方法直接用print()打印对象的话,输出的是对象的存储地址,如果加上__str__方法的话,用print()打印对象的结果就是我们自定义字符串了。
时间:2019年5月2日21:43:10