python什么时候用类设计_Python 类的设计与 Java 类的设计有何区别?
读前声明:本文主要参考了Real Python中的内容,提炼了一些主要的内容,如果英文还不错的想详细了解的话建议直接进入该网站阅读。
提到类的设计,我们不得不提及面向对象(OOP),它是一种编程思想,极大的提高了开发的效率,降低了维护的难度与面向对象相对应的编程模式是面向过程,与面向过程编程相比,它有着易维护,高可复用性和易扩展的优点,而这些优点与面向对象的三大特性是紧密对应的:由于封装的特性,它更加易于维护
由于继承的特性,它更加易于扩展,复用
由于多态的特性,它更加易于扩展,复用
PS:当然天下没有免费的午餐,由于面向对象中加入了类,而类的实例化需要分配内存,增加了时空复杂度,所以性能上会低于面向过程。
接下来,我们针对类的组成部分一一分析python类与Java类设计上的不同之处,每种不同之处都有代码的展示:
0.Java类与python类的整体一瞥:
java:
public class Car {
private String color;
private String model;
private int year;
public Car(String color, String model, int year) {
this.color = color;
this.model = model;
this.year = year;
}
public String getColor() {
return color;
}
public String getModel() {
return model;
}
public int getYear() {
return year;
}
}
python:
class Car:
def __init__(self, color, model, year):
self.color = color
self.model = model
self.year = year
1.类属性和成员方法的访问控制
Java:private/protected/public三种修饰符依次限定成员的访问控制权限,权限由低到高。
Python:相较于Java严格的权限控制,python只有public/non-public两种限定,并且python没有明显的修饰符,以双下划线(‘__’)开头的属性为non-public,而其他则为public。
Ps:因此对于私有属性,Java中通常通过getters和setters函数来进行访问,而python中有对应getter和setter专门的装饰语法,代码如下:
python:
class Car:
def __init__(self, color, model, year):
self.color = color
self.model = model
self.year = year
self._voltage = 12
@property
def voltage(self):
return self._voltage
@voltage.setter
def voltage(self, volts):
print("Warning: this can cause problems!")
self._voltage = volts
@voltage.deleter
def voltage(self):
print("Warning: the radio will stop working!")
del self._voltage
2.类定义与编译单元(文件)的关系
Java中具有public class和class两种不同的形式,而python则没有关于类的限定,这个不同之处体现在工程上就是,Java中public类必须定义在同名文件中,因此一个文件只能定义一个public类。而python则没有这种限制,它可以在一个模块中定义多个类。
3.继承
Python可以多继承,而Java则不允许多继承,如果一个类涉及到与多个其他类存在继承关系时,通常会设计interface来替代class,关于这种机制的产生就不得不引入下面的多态。
java:
public class Vehicle {
private String color;
private String model;
public Vehicle(String color, String model) {
this.color = color;
this.model = model;
}
public String getColor() {
return color;
}
public String getModel() {
return model;
}
}
public interface Device {
int getVoltage();
}
public class Car extends Vehicle implements Device {
private int voltage;
private int year;
public Car(String color, String model, int year) {
super(color, model);
this.year = year;
this.voltage = 12;
}
@Override
public int getVoltage() {
return voltage;
}
public int getYear() {
return year;
}
}
python:
class Vehicle:
def __init__(self, color, model):
self.color = color
self.model = model
class Device:
def __init__(self):
self._voltage = 12
class Car(Vehicle, Device):
def __init__(self, color, model, year):
Vehicle.__init__(self, color, model)
Device.__init__(self)
self.year = year
4.多态
我们学习过多继承都知道“钻石问题”会导致歧义,因此Java利用interface这种机制来避免歧义,也就是同样的方法在不同的类中有不同的实现,而python则采用“duck type”形式来达到相似于接口的目的。代码如下:
python:
>>> def charge(device):
... if hasattr(device, '_voltage'):
... print(f"Charging a {device._voltage} volt device")
... else:
... print(f"I can't charge a {device.__class__.__name__}")
...
>>> class Phone(Device):
... pass
...
>>> class Rhino:
... pass
...
>>> my_car = Car("yellow", "Beetle", "1966")
>>> my_phone = Phone()
>>> my_rhino = Rhino()
>>> charge(my_car)
Charging a 12 volt device
>>> charge(my_phone)
Charging a 12 volt device
>>> charge(my_rhino)
I can't charge a Rhino
总结
通过如上对Java和python类的探讨,从面向对象的封装,继承和多态三种特性着手,分析了两种主流编程语言的异同。发现每种语言的设计都拥有自己的独特规则,但都大同小异,他们都遵从了面向对象的思想。有了这种从本质着手的思维,再次学习新的东西时,就会有大局观,不会纠结小细节,很容易上手。
python什么时候用类设计_Python 类的设计与 Java 类的设计有何区别?相关推荐
- python学生管理系统用类写_python面向对象——学校学生教职工管理系统类的实例...
这里做一个学校的人事管理系统中的类的实例化,其中含有的类:Person.Student.Stuff三个类.下面来具体分析类所要实现的功能. 首先可以定义使用Person类,找出学生和教职工之间的共同属 ...
- java类功能说明注释添加,IDEA添加Java类注释模版的方法
本文介绍了idea添加java类注释模版的方法,分享给大家,具体如下: idea版本:intellij idea 2017.2.5 x64 eclipse能在类上方输入/**,回车添加类注释模版,但i ...
- java 类的访问权限_什么是Java类的访问权限?
展开全部 在解32313133353236313431303231363533e59b9ee7ad9431333366306436释访问权限控制之前,先看一个场景. 在学生信息管理系统中,有两个类,分 ...
- java类加入到spring容器_普通java类加入spring容器的四种方式
今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...
- java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸
植物大战僵尸这款游戏相信大家或多或少都玩过,那么大家有没有想过自己尝试着做一下植物大战僵尸的游戏设计呢.本文将基于Java语言为大家展示如何开发出植物大战僵尸游戏的简易版本,主要内容包括规则.对象.功 ...
- python无效的类字符串_Python不规范的日期字符串处理类
我分析了形如19920203.199203.1992.02.03.1992.02.1992-02-03.1992-02.920203时间格式特征,列出了正则表达式如下: ^((?:19|20)?\d{ ...
- python如何导入类里_Python导入模块中的所有类(98)
要导入模块中的每个类,可使用下面的语法: from mod import * 不推荐使用这种导入方式,其原因有二.首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类,将大有 ...
- idea类前面有个j_idea中所有Java类标识变成一个J
一.只需要按照文件的类型进行配置,让文件选择对应的Mark as中的文件名. 比如下图所示内容:java文件对应的是Mark as中的Sources:resource文件对应于Mark as中的Res ...
- java 课程设计数据库_人事管理系统(java数据库课程设计)+SQL数据库
[实例简介] 员工各种信息:包括员工的基本信息,如编号.姓名.性别.学历.所属部门.毕业院校.健康情况.职称.职务.奖惩等:员工各种信息的修改:对转出.辞退.退休员工信息的删除:按照一定条件,查询.统 ...
- java类载入器——ClassLoader
Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非 ...
最新文章
- Object.keys方法之详解
- FWFT FIFO读操作注意
- CVPR 2022 | 模型难复现不一定是作者的错,最新研究发现模型架构要背锅
- 新的html页面拼接类库(简易的模板引擎)
- 笔记-中项案例题-2019年下-信息系统安全管理
- public private protected
- mysql日期格式化季度_Mysql按周,按月,按日,按小时分组统计数据
- Nginx 通过 Lua + Redis 实现动态封禁 IP
- java的引用指的是什么_请问java里的引用是指什么啊?
- label 阻止冒泡 防止点击label 触发2次事件
- 获取客户端访问的ip地址
- windows10便签在哪,windows电脑版便签工具在哪里打开
- unity打开android界面报错,Unity3D与Android交互介绍.docx
- Incapsula到底是什么
- 关于数学建模的个人见解(实验室专用)
- java 中定义整形变量_智慧职教: 在Java语言中,一条语句可以定义多个变量。例如int a; b;就定义了两个整型变量a 和b。...
- 天津医科大学计算机研究生吧,天津医科大学
- python 权限认证 impala_python操作具有kerberos认证的hive(impala)
- 实现微信聊天界面的泡泡对话框效果(改进)
- 创新驱动看广东,上云本领看云宏!全国30多家网媒齐聚云宏参访!
热门文章
- python 模拟一元线性回归模型
- python图片转为二进制流_python将图片转为二进制-女性时尚流行美容健康娱乐mv-ida网...
- Win10能更逆天?17款系统增强小工具推荐
- 多重网络与计算机之间是感叹号,电脑出现多重网络的原因及解决方法(图)
- 快速搭建一个简易的HTTP服务器用于文件分享与下载
- 【学以致用】android功能实现9---Launcher之AS中,在Launcher源码中增加google负一屏的实现方法
- 苹果清除缓存_苹果手机卡顿别着急换,调整这5个功能,iPhone 6S还可以再战两年...
- 导出excel的两种方式
- 托福备考专项说:七步挑战阅读高分
- linux格式化硬盘命令mkfs,mkfs命令