读前声明:本文主要参考了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 类的设计有何区别?相关推荐

  1. python学生管理系统用类写_python面向对象——学校学生教职工管理系统类的实例...

    这里做一个学校的人事管理系统中的类的实例化,其中含有的类:Person.Student.Stuff三个类.下面来具体分析类所要实现的功能. 首先可以定义使用Person类,找出学生和教职工之间的共同属 ...

  2. java类功能说明注释添加,IDEA添加Java类注释模版的方法

    本文介绍了idea添加java类注释模版的方法,分享给大家,具体如下: idea版本:intellij idea 2017.2.5 x64 eclipse能在类上方输入/**,回车添加类注释模版,但i ...

  3. java 类的访问权限_什么是Java类的访问权限?

    展开全部 在解32313133353236313431303231363533e59b9ee7ad9431333366306436释访问权限控制之前,先看一个场景. 在学生信息管理系统中,有两个类,分 ...

  4. java类加入到spring容器_普通java类加入spring容器的四种方式

    今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...

  5. java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸

    植物大战僵尸这款游戏相信大家或多或少都玩过,那么大家有没有想过自己尝试着做一下植物大战僵尸的游戏设计呢.本文将基于Java语言为大家展示如何开发出植物大战僵尸游戏的简易版本,主要内容包括规则.对象.功 ...

  6. python无效的类字符串_Python不规范的日期字符串处理类

    我分析了形如19920203.199203.1992.02.03.1992.02.1992-02-03.1992-02.920203时间格式特征,列出了正则表达式如下: ^((?:19|20)?\d{ ...

  7. python如何导入类里_Python导入模块中的所有类(98)

    要导入模块中的每个类,可使用下面的语法: from mod import * 不推荐使用这种导入方式,其原因有二.首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类,将大有 ...

  8. idea类前面有个j_idea中所有Java类标识变成一个J

    一.只需要按照文件的类型进行配置,让文件选择对应的Mark as中的文件名. 比如下图所示内容:java文件对应的是Mark as中的Sources:resource文件对应于Mark as中的Res ...

  9. java 课程设计数据库_人事管理系统(java数据库课程设计)+SQL数据库

    [实例简介] 员工各种信息:包括员工的基本信息,如编号.姓名.性别.学历.所属部门.毕业院校.健康情况.职称.职务.奖惩等:员工各种信息的修改:对转出.辞退.退休员工信息的删除:按照一定条件,查询.统 ...

  10. java类载入器——ClassLoader

    Java的设计初衷是主要面向嵌入式领域,对于自己定义的一些类,考虑使用依需求载入原则.即在程序使用到时才载入类,节省内存消耗,这时就可以通过类载入器来动态载入. 假设你平时仅仅是做web开发,那应该非 ...

最新文章

  1. Object.keys方法之详解
  2. FWFT FIFO读操作注意
  3. CVPR 2022 | 模型难复现不一定是作者的错,最新研究发现模型架构要背锅
  4. 新的html页面拼接类库(简易的模板引擎)
  5. 笔记-中项案例题-2019年下-信息系统安全管理
  6. public private protected
  7. mysql日期格式化季度_Mysql按周,按月,按日,按小时分组统计数据
  8. Nginx 通过 Lua + Redis 实现动态封禁 IP
  9. java的引用指的是什么_请问java里的引用是指什么啊?
  10. label 阻止冒泡 防止点击label 触发2次事件
  11. 获取客户端访问的ip地址
  12. windows10便签在哪,windows电脑版便签工具在哪里打开
  13. unity打开android界面报错,Unity3D与Android交互介绍.docx
  14. Incapsula到底是什么
  15. 关于数学建模的个人见解(实验室专用)
  16. java 中定义整形变量_智慧职教: 在Java语言中,一条语句可以定义多个变量。例如int a; b;就定义了两个整型变量a 和b。...
  17. 天津医科大学计算机研究生吧,天津医科大学
  18. python 权限认证 impala_python操作具有kerberos认证的hive(impala)
  19. 实现微信聊天界面的泡泡对话框效果(改进)
  20. 创新驱动看广东,上云本领看云宏!全国30多家网媒齐聚云宏参访!

热门文章

  1. python 模拟一元线性回归模型
  2. python图片转为二进制流_python将图片转为二进制-女性时尚流行美容健康娱乐mv-ida网...
  3. Win10能更逆天?17款系统增强小工具推荐
  4. 多重网络与计算机之间是感叹号,电脑出现多重网络的原因及解决方法(图)
  5. 快速搭建一个简易的HTTP服务器用于文件分享与下载
  6. 【学以致用】android功能实现9---Launcher之AS中,在Launcher源码中增加google负一屏的实现方法
  7. 苹果清除缓存_苹果手机卡顿别着急换,调整这5个功能,iPhone 6S还可以再战两年...
  8. 导出excel的两种方式
  9. 托福备考专项说:七步挑战阅读高分
  10. linux格式化硬盘命令mkfs,mkfs命令