类(class)是构造对象的模板或蓝图。由类构造(construct)对象的过程称为创建类的实例(instance)。
类提供了一种组合数据和功能的方法。创建一个新类意味着创建一个新类型的对象,从而允许创建一个该类型的新实例。
在对于类的定义上,Python3与Java定义一致。
类
下面分别用Java和Python3编写一个People类。
1 | /** |
Java执行结果

1 | class People: |
Python执行结果

小结
| Java | Python | |
|---|---|---|
| 私有属性 | (成员变量)使用private关键字修饰 |
属性名双下划线开头__;不建议将属性设置为私有,建议以_(单下划线)开头,暗示属性为受保护的,不建议外部直接访问,建议使用getter、setter进行操作 |
| 类属性 | 使用static修饰的变量 |
类和对象都可以访问 |
| 构造方法 | 有参、无参构造器;方法名与类名相同 | (实例化方法)方法名固定__init__ |
| 实例方法 | 对象访问 | (普通方法)对象访问,默认有参self |
| 私有方法 | 使用private关键字修饰 |
方法名双下划线开头__ |
| 静态方法 | 使用static关键字修饰 |
使用@staticmethod装饰器,可以无参 |
| 类方法 | 同静态方法 | 使用@classmethod装饰器,类和对象访问,默认参数cls |
继承
在Java中类只能单继承继承,因为Java的设计者认为,多继承会让语言本身变得非常复杂(如同C++),效率也会降低(如同Eiffrl),而为了让程序设计更加灵活,Java中就有了接口(interface),接口之间可以多继承。而Python的类可以多继承,也就没必要有接口;下面分别使用Java和Python 3实现Student子类
1 | public class Student extends People{ |
Java执行结果

1 | # 单继承 |
Python执行结果

小结
Java与Python 3 在掉用构造方法时顺序是一致的,但是Java在构造方法内调用父类构造方法,语句super()必须放在方法体的第一句;而Python 3,对象是由 __new__()和__init__()协作构造完成,实例通过__new__方法被创建,使用__init__方法进行初始化;所以在调用父类方法之前,可以对参数进行定制修改。Python 3 的多继承,在搜索从父类继承的方法/属性时,可以简单认为是深度优先、从左至右;但为了保持单次调用,实际在调用时是动态的;
多态
实现多态的步骤:1.继承父类 2.重写父类方法 3.向上转型
1 | /**1.Teacher继承自People**/ |
1 | public class Test { |
java运行结果:

1 | class Teacher(People): |
Python运行结果:

小结
Python从语法层面并没有像Java那样提供对抽象类的支持,但是我们可以通过
abc模块的ABCMeta元类和abstractmethod(class CLASSNAME(metaclass=ABCMeta):)包装器来达到抽象类的效果,如果一个类中存在抽象方法那么这个类就不能够实例化。