类(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):
)包装器来达到抽象类的效果,如果一个类中存在抽象方法那么这个类就不能够实例化。