目录
staticmethod()和classmethod()内建函数
hasattr()、getattr()、setattr()、delattr()
面向对象编程
常用术语/名词解释
抽象/实现
抽象指对现实世界问题和实体的本质表现、行为和特征建模,建立一个相关的子集,可以用于描绘程序结构,从而实现这种模型。抽象不仅包括这种模型的数据属性,还定义了这些数据的接口。对某种抽象的实现就是对此数据及与之相关接口的现实化( realization)。现实化这个过程对于客户程序应当是透明而且无关的。
封装/接口
封装描述了对数据/信息进行隐藏的观念,它对数据属性提供接口和访问函数。通过任何客户端直接对数据的访问,无视接口与封装性都是背道而驰的,除非程序员允许这些操作。作为实现的一部分,客户端根本就不需要知道在封装之后,数据属性是如何组织的。在 Python中,所有的类属性都是公开的,但名字可能被“混淆”了,以阻止未经授权的访问,但仅此而已,再没有其他预防措施了。这就需要在设计时,对数据提供相应的接口,以免客户程序通过不规范的操作来存取封装的数据属性。
合成
合成扩充了对类的描述,使得多个不同的类合成为一个大的类,来解决现实问题。合成描述了一个异常复杂的系统,比如一个类由其他类组成,更小的组件也可能是其他的类,数据属性及行为,所有这些合在一起,彼此是“有一个”的关系。比如, RepairShop“有一个”技工(应该至少有一个吧),还“有个”顾客(至少一个)。
派生/继承/继承结构
派生描述了子类的创建,新类保留已存类类型中所有需要的数据和行为,但允许修改或者其他的自定义操作,都不会修改原类的定义。
继承描述了子类属性从祖先类继承这样一种方式。从前面的例子中,技工可能比顾客多个汽车技能属性,但单独的来看,每个都“是一个”人。继承结构表示多“代”派生,可以描述成一个“族谱”,连续的子类,与祖先类都有关系。
泛化/特化
泛化表示所有子类与其父类及祖先类有一样的特点,所以子类可以认为同祖先类是“是一个”(is-a)的关系,因为一个派生对象(实例)是祖先类的一个“例子”。比如,技工“是一个”人,车“是一个”交通工具等。
特化描述所有子类的自定义,也就是,什么属性让它与其祖先类不同。
多态
多态的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需考虑他们具体的类多态表明了动态(后来又称运行时)绑定的存在,允计重载及运行时类型确定和验证。
自省/反射
自省表示给予程序员某种能力来进行像“手工类型检查”的工作,它也被称为反射。这个性质展示了某对象是如何在运行期取得自身信息的。传一个对象给我们,我们可以查出它有什么能力。比如内建函数dir()和type(),以及类的特殊属性__dict__,__name__及__doc__都能实现自省的效果。
访问限制
私有属性和公有属性
在player类内定义了name和age属性,然后创建类的实例wxj,通过实例访问类的name和age属性并对其做出修改,最后通过实例调用类方法printInfo()打印出球员的姓名和年龄。此时,name和age属性是公有属性,可以从外部进行访问和修改。
假设想限制外部代码对类内部属性的修改,则可以将属性设为私有变量。方法是在属性名称前加双下划线。