python面向对象程序设计(OOP)
-
类定义语法
class className:
在python中可以使用内置方法isinstance()来测试一个对象是否为某个类的实例。 -
self参数
类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个参数,self参数代表对象本身。在类的实例方法中访问实例属性时需要以self为前缀,但在外部通过对象名调用对象方法时并不需要传递这个参数,如果在外部通过调用对象方法则需要显示为self参数传值。
-
类成员与实例成员
实例属性:在构造函数
__init__()
中定义,定义和使用时必须以self作为前缀。类属性:是在类中所有方法之外定义的数据成员。
在主程序,实例属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名和对象名访问。
python特有的动态类型特点:可以动态地为类和对象增加成员。
实例对象.外加方法 = types.MethodType(方法,类)
-
私有成员与公有成员
用下划线作为变量名和方法名前缀和后缀来表示类的特殊成员。
*_xxx
:这样的对象叫做保护成员,不能用"from module import ",只有类对象和子类对象能访问这些成员。
*__xxx__
:系统定义的特殊成员。
*__xxx
:类中私有成员,只有类对象自己能访问,子类对象也不能访问到这个成员,但在对象外部可以通过对象名._类名__xxx
*这样的特殊方式访问。
-
方法:
-
公有方法
,私有方法
,静态方法
,类方法
。
公有方法,私有方法属于对象,私有方法的名字以"__"开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员。
公有方法通过对象名直接调用,私有方法不能,只能在属于对象的方法中通过self调用或在外部通过python支持的特殊方式来调用。如果通过类名来调用属于对象的公有方法,需要显示为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员。
静态方法和类方法都可通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。一般将cls作为类的第一个参数名称,并且在调用类方法时不需要为该参数传递值。
class classname: @classmethod #类方法 def classmethod(cls): @staticmethod #静态方法 def …
-
-
属性
在python2.x中,使用@property或property()函数来声明一个属性(把一个方法变成属性调用),然而属性并没有得到真正意义的实现,也没有提供应有的访问保护机制,为对象增加新的数据成员时,将隐藏同名的已有属性。
-
继承机制
在继承关系中,已有的设计好的类称为父类或基类,新设计的类称为子类或派生类。派生类可以继承父类的公有成员,但是不能继承其私有成员。如果需要在派生类中调用基类的方法,可以使用内置函数
super()
或通过基类名.方法名()
的方式来实现。
python支持多继承,如果父类中有相同的方法名,而在子类中使用时没有定义父类名,则python解释器将从左至右按顺序搜索