搬砖的也能玩Python——基础篇
7-面向对象(一)-类和实例
回顾
Python是面向对象的编程,在面向对象编程中,我们编写现实世界中的事物和情景的类,这些类中都大家通用的行为,基于这些类来创建对象,根据需要再给创建出来的对象增加各自特有的行为。
从这篇文章开始,我们一起走进面向对象的世界。
一、面向对象中的几个概念
说最开始,我们先结合现实世界中的事物,来了解面向对象中的几个概念,这些概念将会一直伴随我们后面的内容,大家先熟悉一下,我们就利用“人类”这个例子,来看下面几个概念:
类
用来描述具有相同属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。比如:“人类”就是一个类,此时只是一个抽象的模板,还没有具体指哪一个人。
属性
属性就是我们在类中创建的一些变量,这些变量必须通过实例来访问。比如:“人类”肯定都有“姓名”、“年龄”、“性别”等,这些就是我们的属性。
方法
方法就是我们在类中创建的一些函数,这些函数可以理解为类里的每个对象所共有的行为,比如:“人类”可以“说话”、“行走”等,这些就是我们的方法。
实例化
根据类来创建出一个具体的对象,就是实例化,而创建出来的这个对象就是我们的实例,比如:具体的某一个人,就是“人类”的一个实例。
二、创建类
了解了一些概念之后,我们从创建类开始学习,类的定义:
Class 类名(继承类):
类的内容
首先有一个class关键字,紧跟着是类名,类名根据约定首字母大写,如果类存在继承,就在类名后跟一个括号,括号里写上要继承的类名,然后跟着冒号,再写类的具体内容,类的具体内容也是要缩进的。我们来看一个简单的例子:
首先,我们看到有一个__init__()方法,注意是两个下划线,这个方法是一个特殊的方法,当创建实例的时候,会自动执行__init__()方法,不需要调用。
其次,我们看到在每个方法中,第一个参数一定是self,这是固定的写法,表示实例对象本身,能让实例访问类中的属性和方法,在实例调用方法的时候,会自动传入self,所以在使用方法的时候,不需要再传入self参数,只是在定义的时候写。
还有一个要注意的,就是在__init__()方法中,我们还定义了name和age两个形参,这说明我们在创建实例的时候,必须要传入name和age两个形参的实际值,否则会引起异常。
在上面这个例子中,self.name和self.age就是我们定义的属性,在name和age前面都有self前缀,说明我们定义的两个属性可供类中的所有方法使用,而且也可以在实例化之后,通过任何实例来访问这些属性。
三、根据类创建实例
创建实例
定义好了类以后,我们要使用这个类,做的第一件事就是创建类的实例,怎样创建呢?很简单,只需要在类名后面加个括号,括号中传入所需的参数即可,我们可以把这个类赋值给一个变量,那么这个变量就是代表这个类的一个实例了,也就是:
变量名 = 类名(__init__方法中除了self的变量)
我们来把上一节的类实例化:
如上图所示,我们在Person类后跟括号,括号中传入了具体的name和age的值,这样,我们的类就实例化完成了。
注意
需要注意的是,虽然在__init__()方法中,第一个参数是self,但是我们在实例化以及后面调用方法的时候,都不需要传self,Python解析器会自动将实例对象本身传递给方法。
访问属性
创建了实例之后,就可以访问实例的属性,直接用句点加属性名即可,也就是:
实例.属性名
我们来访问一下类中的name和age属性:
如上图,实例化的时候,我们传了2个实参“Lillian”和“18”,“Lillian”赋值给了self.name,“18”赋值给了self.age,所以我们用lillian.name和lillian.age就可以得到具体的值。
调用方法
创建好了实例之后,这个实例就可以使用类中定义的任何方法了,跟属性一样,直接用句点加方法名即可,也就是:
实例.方法名(方法参数)
我们来调用一下类中的introduce()方法:
同样的,虽然在类中定义introduce()方法时有一个self参数,但是在调用的时候不需要传self。
创建多个实例
可以根据需要针对同一个类创建任意数量的实例,每一个实例都是独立的实例,都有自己的一组属性,能够执行相同的操作。
四、属性的操作
创建好的实例,不仅可以访问类中的所有属性和方法,还可以设置新的属性、修改原有属性的值。
设置属性
通过实例名.新属性=属性值就可以给实例设置类中没有的属性,其本质就是定义一个新的变量。
如上图,创建了tom实例之后,通过tom.email给tom增加了email属性。
修改属性值
上面提到属性的其实就是一个变量,所以要修改属性的值,只需要给属性赋个新值即可,也就是实例名.属性=新属性值。
五、属性的访问权限
在上面的例子中,我们可以任意修改属性的值,如果要让内部属性不能随意访问、修改,那应该怎么办?
在Python中,可以通过在属性名前加两个下划线(__)的方式,来让属性变成私有属性,这样在创建实例之后,不能直接通过实例.属性名的方式来访问、修改属性。
上图中,我们把self.name和self.age变成了self.__name和self.___age,这样我们来看一下执行之后的结果。
我们看到会提示没有__name这个属性,这样__name属性就变成了类里面私有的属性,实例没有办法直接访问,那么实例要想访问、修改属性的话,应该怎么做呢?我们来看下面的例子:
我们通过在类里面定义访问属性、修改属性的方法,就可以实现私有属性的访问和修改了。
思考
双下划线开头的属性,是不是一定不能从外部访问和修改呢?
解析
在Python中,并没有专门的私有属性,我们在属性名前面加了双下划线之后,实例无法访问,主要是因为Python解释器对外把属性名进行了修改,我们可以通过__dict__属性来看一下实例中有哪些属性。
从上图的结果中,我们看到实例tom有2个属性,分别是_Person__name和_Person__age,也就是Python解释器对外把属性名前面加了_Person,也就是说我们在外部可以直接通过_Person__name来访问和修改属性,并不是真正意义的私有属性。
探测八个蛋∣跳出手工测试的井
领取专属 10元无门槛券
私享最新 技术干货