class是关键字,bases是要继承的父类(默认继承object类)。
class documentation string是类文档字符串,一般用于类的注释说明。
class_suite是类体,主要包含属性和方法。
类、属性和方法的命名约定惯例如下:
类名:表示实例的抽象,命名时首字母大写。
属性:使用名词作为名字,比如name、age、weight等。
方法名:一般指对属性的操作,其命名规则一般采用动词+属性名称形式,如updateName、updateAge、updateWeight等。
Python的类分为两种:
经典类:Python2.x中类定义的默认方式,不继承object类,其内部由属性和方法组成,如:
新式类:Python3.x中类定义的默认方式,必须继承object方法,如:
· 新式类修复了经典类的一些BUG(如多重继承时的歧义等),并且提供了类方法和静态方法的支持。
·· 在Python3.x中,如果没有显示指明要继承的父类,则默认继承object类。
Python3.x中,无需继承时,例子中三种类的创建效果一样。自动继承object类。
新式类添加了一些内置属性和方法,如:
对象的创建:
类创建完之后,再创建该类的实例或对象,此过程称之为实例化。如:
对象标识符为people,属性为括号中的内容,方法为类中方法。
· 当一个对象被创建后,就包含标识、属性和方法这三个方面的对象特性了。其中,对象标识用于区分不同的对象,属性和方法与类中的成员变量和成员函数相对应。
类的属性:
属性分为类级别和实例级别两种。实例级别的属性值默认共享类级别的属性值,除非进行赋值操作,如:
该例有三个实例,分别为类实例A和对象实例obj2、obj3。
则有:
情形1中,obj2与obj3两个对象实例共享类实例A的属性age;
情形2中,修改了对象实例obj2的属性age;
情形3中,修改了类实例A的属性age。
结果如下:
情形2中由于修改了对象实例obj2的属性age,其属性值和类实例A的属性值已经独立;而对象实例obj3的属性值从来没有修改过,所以还是和类实例A的属性值保持一致。
· Python语言对于属性的设置采用“类.属性=值”或“实例.属性=值”。
Python语言中的属性操作遵循三个规则:
1.属性的获取是按照从下到上的顺序来查找;
2.类和实例是两个完全独立的对象;
3.属性设置是针对实例本身进行的。
类的定义由属性和方法组成,属性是对数据的封装,方法则是对类行为的封装。
属性按使用范围分为公有属性和私有属性,使用范围取决于属性名称,如:
内置属性,如:
类的方法:
包括公有方法、私有方法、类方法和静态方法,如:
例:
类方法和静态方法原理上有以下区别:
1.静态方法不能使用self的方式调用;
2.静态方法调用时会预先将类中用到的属性和方法进行加载,而类方法是随意调用。因此,类方法相比静态方法具有不占资源的优势,但速度不及静态方法;
3.静态方法调用类中的属性时需要使用“类名.属性”的格式。
内部类:
类的内部定义封装,主要目的是更好抽象现实世界,如:
People类中又定义了Father类和Mother类两个内部类。
· 创建内部类的实例化对象可以通过外部类的实例化对象调用内部类完成,如第一种实例化方法;也可以直接使用外部类名调用内部类,如第二种实例化方法。
·· 一般情况下不使用内部类,会使程序结构复杂,但理解内部类有助于理解模块的调用。
内部类调用的两种方式:
1.直接使用外部类调用内部类;
2.先对外部类进行实例化,然后再实例化内部类。
魔术方法:
Python语言中,所有以双下划线 “ __ ” 包起来的方法统称为“魔术方法”,这些方法会自动调用,如 “ __ str __() ” 、“ __ init __() ” 、“ __ del __ () ” 等。
· 魔术方法中的 “ __ init __() ” 方法一般叫做构造函数,用于初始化类的内部状态和参数。若不提供,则使用默认的 “ __ init __() ” 方法。
· 魔术方法中的 “ __ del __() ” 叫做析构函数,用于释放对象占用的资源。“ __ del __() ” 函数是可选的,若不提供,则使用默认析构函数。
· 魔术方法中,有些可以实现属性访问控制的功能,如 “ __ getattr __(self,name) ” , “ __ setattr __(self,name,value) ” 方法等。
例:
如例所示,对于这些魔术方法,在创建对象时可以自动执行。当对象自动执行析构函数“A.del()”后,对象仍然存在,但是在调用“del A”,后,对象就已经被回收删除,无法再次使用。