Python3基础:08_02_面向对象编程(OOP)——类和对象

0.前言

  这篇博文将讲述Python面向对象开发中的类与对象的概念,包括对类和对象的理解,类和对象的关系以及类和对象的创建。


加深对封装概念的理解:01_Python3中对封装的认识


1.类和对象的概念

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
我爱看书!

注意:

  • 格式要求:类和函数体一样,需要与其他代码有两行的间距,每个方法之间也应该有一行的间距,体现Python语言的特色。
  • 程序分析:这个程序首先创建了一个人类“Person”,在这个类中创建了“名字”、“年龄”、“身高”等三个属性和“跑步”、“看书”等两个方法。后面创建了两个“人”对象“Cain”和“Cary”,创建对象时,需要传入相应的三个属性,创建好的对象可以调用类中的方法。以上Cain对象调用的方法是跑步,Cary调用的方法是看书,当然Cain也可以调用看书,Cary同样也可以跑步。
    这个过程和函数调用、模块调用的过程很像,道理是相通的,这个程序看不懂没关系,看后面的分步解析。


2.内置函数方法

介绍几种常用的类的内置方法

方法名 作用
__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__方法中添加这些要做的事情,比如上面的程序,离开的时候说我走了。


  另外一种情况就是用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


你可能感兴趣的:(Python2,基础,面向对象编程,类和对象)