Python也开始支持抽象类和多态了,但是Python的继承与Java有很多不同的地方
Python只有私有属性
(双下划线__
属性)和公有属性(默认属性),没有protected属性
- 解决方案是Python提出命名时单下划线的属性为protected属性
- 但是这只是一种口头约定,Python解释器并不做强制处理
- 模块中的函数如果是单下划线开头的,那么该函数属于当前模块保护的
- 此时某些IDE,比如Idea能够给出提示,但是用户仍可访问
- 编程时建议将模块中不被调用的文件定义为_开头的,这样可以提示自己和别人当前函数不会在模块外被调用
Python类属性定义
属性定义在__init__
函数中才能在对象中通过__dict__
属性读取到
Python支持虚拟继承
可以欺骗编译器,不用真正实现虚拟基类的所有接口
都是强类型语言
这是他们的相同点,但我觉得写在这里是必要的
方法类型不同
- Java中有一般方法(实例方法),静态方法(
static
类名和对象均可直接调用)两种- Java中这两种方法也都可以被继承和隐藏,而不能被重写(隐藏的意思时换成对应的父类指针还能访问到父类的静态属性和方法)
- Python中有一般方法(实例方法),静态方法(
@staticmethod
类名和对象均可直接调用)和类方法@classmethod
- 对
@staticmethod
方法的理解是,该方法与类密切相关,但是不需要访问这个类 - Python的
@staticmethod
和@classmethod
方法调用方式一样,唯一的区别在于@classmethod
方法第一个参数必须是当前类(一般命名为cls
) - Python中的这三种方法都可以被继承和重写
- 对
函数定义
- 三种函数, 普通函数(实例函数), 类函数(classmethod), 静态函数(staticmethod)
普通函数
- 无需任何装饰器
- 无论如何定义,函数的第一个参数都会被当成实例对象本身(一般用self)
类函数
- 装饰器 @classmethod
- 无论如何定义,函数的第一个参数都会被当成实例对象本身(一般用cls)
静态函数
- 装饰器 @staticmethod
- 所有参数都是函数所有,不被占用