类的定义
Python使用class
关键字来定义类
class Car:def infor(self):print("This is a car")
car = Car()
car.infor()
内置方法isinstance()
来测试一个对象是否为某个类的实例
self参数
- 类的 所有实例方法都有一个默认的
self
参数,并且必须是方法的第一个形参。但是不一定命名为self
self
参数代表将来要创建的对象(实例)本身- 在内部,访问实例属性需要以
self
为前缀 - 在外部,通过对象名调用对象方法时并不需要传递这个参数,如果在外部通过类名调用对象方法则需要显示为
self
传递参数
类的成员和实例成员
- 类的成员:在类中所有方法定义之外定义的,通过类名或者对象名来访问
- 实例成员:一般是指在构造函数
__init__()
中定义的(在其他函数中也可以,在外部定义也可以),在类内部定义和使用时必须以self
作为前缀,在类的外部必须通过对象名访问。我们可以同时拥有相同名字的类成员和实例成员。当名字相同时根据访问方式的不同进行区分 - 类成员是各个实例共享的,而实例成员不会共享
- 混入(mixin)机制:可以动态地为类和对象增加成员,是Python动态类型特点的重要体现
- 混入机制在大型项目开发中非常方便和实用
私有成员和公有成员
- 私有成员:以两个下划线
__
开头- 在类的外部不能直接访问,需要通过对象的公有成员方法来访问
- 可以通过Python支持的特殊方式来访问
- 公有成员:既可以在类的内部访问,也可以在外部程序中使用
用下划线作为变量名和方法名前缀和后缀表示类的特殊成员:
_XXX
受保护成员,不能用from module import *
导入__XXX__
系统定义的特殊成员__XXX
私有成员,只有类对象自己能访问,在对象外部可以使用对象名._类名_XXX
这样特殊的方式进行访问
在IDLE
环境中,在对象或者类名后面加上一个圆点.
稍等一秒钟会自动列出其所有公开成员,模块也具有同样的用法
在圆点.
后面再加一个下划线则会列出该对象、类或者模块的所有成员,包括私有成员
成员方法
- 公有方法、私有方法都属于对象,私有方法的名字以两个下划线开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和成员的对象
- 公有方法通过对象名直接调用,私有方法不能直接调用,只能再属于对象的方法中使用
self
调用或者使用特殊的方式 - 如果通过类名来调用属于对象的公有方法,则需要显式为该方法传递self参数,用来指明访问哪个对象的数据成员
- 静态方法和类方法都可以用过类名和对象名调用,但不能直接访问属于对象的实例成员,只能访问属于类的成员
- 一般将
cls
作为类方法的第一个参数名称,但也可以用其他名字作为参数,并且在调用类方法时不需要为该参数传递值 - 从类⽅法和实例⽅法以及静态⽅法的定义形式就可以看出来,类⽅法的第⼀ 个参数是类对象cls,那么通过cls引⽤的必定是类对象的属性和⽅法;⽽实例 ⽅法的第⼀个参数是实例对象self,那么通过self引⽤的可能是类属性、也有 可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实 例属性的情况下,实例属性优先级更⾼。静态⽅法中不需要额外定义参数, 因此在静态⽅法中引⽤类属性的话,必须通过类对象来引⽤