python kotlin

介绍

在今天的文章中,我们将继续上周的文章,内容涉及使用Java和Python创建类似Kotlin的构建器,并扩展了构建器API以采用一些可选参数以提高灵活性。 我们继续我们HTML示例,尝试添加标记属性,例如class,id和style。

Kotlin和Python

Kotlin设置使用这些参数的方式与我在Python中的使用方式完全相同:默认参数和命名参数。 使用Kotlin看起来像这样:

html {body {p(klass="myClass", id="theParagraph") {+ "the paragraph text"}}
}

请注意,使用“杯子”而不是“类”。 关键字和标识符的经典冲突。 您可以根据需要使用“ cls”,“ clazz”或其他任何东西。 我建议不要使用类对象语言中通常使用的任何东西,因为这是完全不同的类。

与上周的p标签相比,这是一个很大的升级(只是p = "text" ),将其从属性更改为成熟的方法。 但是大多数其他示例不需要太多工作。 这是更新的Kotlin代码:

class Body {...fun p(class: String="", id: String="", style: Style=Style.blank, paragraphBuilder: Paragraph.() -> Unit) {val p = Paragraph(class, id, style)paragraphs.add(p)p.paragraphBuilder()}...
}class Paragraph(val class: String, val id: String, val style: Style) {var text: String = ""operator fun plus(other: String) {text += other}
}

更新后的Python代码(仍使用第一个版本)如下所示:

class Body:def __init__(self):self.paragraphs = ...def p(self, klass='', id='', style=None):par = Paragraph(klass, id, style)self.paragraphs.append(par)return parclass Paragraph:def __init__(self, klass, id, style):self.klass = klassself.id = idself.style = styleself.text = ''def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):return Falsedef __iadd__(self, text):self.text += text

__iadd__()是就地加法运算符,允许我们说p += 'text' 。 在Kotlin中,我们使用+而不是+=因为我们不必引用段落对象,因此从+=开头看起来是错误的,而我们需要在Python代码中引用p ,因此+=看起来更自然,这样,我们就可以将调用代码更改为以下形式:

html = Html()
with html as html:with html.body() as body:with body.p(class='myClass', id='theParagraph') as p:p += 'the paragraph text'

Kotlin和Python都采用Style对象,而不是像其他字符串一样仅接受另一个字符串。 实际上,我建议也对class和id做同样的事情,因为从那时起,我们将class和id对象及其CSS设置传递给CSS生成器。 我只是为了举例而没有在这里做。 我不让Style保留字符串,因为最好使用某种CSS样式生成器来提供更好的清晰度和正确性。

Java

Kotlin和Python都使过渡非常简单。 不幸的是,Java没有设置必需的功能来进行如此简单的更改。 您必须依靠古老的流利的API技巧来使您理解它。

重载嘉豪!

首先想到的是尽可能多地进行带有大量重载的转换。 您可以为class和id字段创建快速,方便的字符串包装器,因为它们都只是字符串,因此很难区分两者:

class Class {public final String text;public Class(String text) {this.text = text;}
}class ID {public final String text;public ID(String text) {this.text = text;}
}

这使得所有重载看起来像这样:

class Body {...public void p(Consumer<Paragraph> paragraphBuilder) {...}public void p(Class klass, Consumer...) {...}public void p(ID id, Consumer...) {...}public void p(Style style, Consumer...) {...}public void p(Class klass, ID id, Consumer...) {...}// and so on... 3 more times...
}

这变得非常乏味,以至于我什至没有写完每一行,更不用说开始所有行了。 而且这仅考虑了类,id和样式。 还有更多。 走这条路是不好的。 因此,我什至不会显示结果代码的样子。 另外,对于其余的想法,我不会费心地展示API的实现,希望它是不言而喻的。 如果您真的对如何实现其中一种API感到好奇,请告诉我。

内部设定

设置这些属性的另一种方法是在构建器中进行设置。 提供用于设置这些值的“ Paragraph方法。 在body标签内看起来像这样:

html.body(body -> {body.p(p -> { p.klass = "myClass"; p.id = "theParagraph";p.addText("the paragraph text");});
});

这并不可怕(特别是在第一行上有那些设置程序行;将它们放在后续行上会混淆其目的),并且这可能是最简单的,但是错误代码的可能性会很高:

html.body(body -> {body.p(p -> {p.klass = "myClass";p.addText("the paragraph text");p.id = "theParagraph";});
});

让我们看看其他选项。

属性对象

仅使用p()两个重载(一个仅接受构建器函数的重载,以及一个既接受构建器函数又包含Attributes对象的重载),我们可以制作一个非常干净的API,看起来像这样:

html.body(body -> {body.p(Attributes.klass("myClass").id("theParagraph"), p -> {p.addText("the paragraph text");});
});

就个人而言,这是我的最爱。 它需要更多的类和更多的实际复杂性,但是我觉得它是最可扩展的。 最大的不便是不同HTML标签具有不同的属性集。 可能应该有一个公共的Attributes构建器类,再加上一个特定于标记的类,从而使重载次数最多达到4(没有属性,只有基本的属性,只有特定于标记的属性,以及这两种类型)。 四个重载是可以容忍的,但可能不应该。 如果看起来太多,最好坚持最后一种策略。

不过,为了完整起见,我还有一个,它实际上可能对其他不模仿HTML或XML的API更好地工作。

通话后大楼

最后一个想法是让Body.p()返回Paragraph (最好是构建器的第二阶段,因为这些方法可以在构建器lambda中使用,否则可以调用它们),如下所示:

html.body(body -> {body.p(p -> {p.addText("the paragraph text");}).klass("myClass").id("theParagraph");
});

这实际上将Attributes类移到末尾,作为“ Paragraph构建器的第二阶段。

奥托罗

那是我能给你的最好的。 如果您有兴趣使用Java之类的语言来构建流畅的API,则应查阅jOOQ的文章,了解它们的用法 。 这是一种完全不考虑lambda的不同方式,这很好。 无论如何,下周我将发表一系列简短的书评文章时,我将与你们交谈。

翻译自: https://www.javacodegeeks.com/2016/01/kotlin-like-builders-java-python-continued-additional-parameters.html

python kotlin

python kotlin_Java和Python中类似Kotlin的生成器,续:附加参数相关推荐

  1. Java和Python中类似Kotlin的生成器,续:附加参数

    介绍 在今天的文章中,我们将继续上周的文章,内容涉及用Java和Python制作类似于Kotlin的构建器,扩展构建器API以采用一些可选参数来提高灵活性. 我们继续我们HTML示例,尝试添加标记属性 ...

  2. 【Python/工具】Pycharm中如何查看一个函数需要哪些参数

    光标停留在函数的括号内,ctrl+p查看一个函数需要哪些参数

  3. python kotlin_在Python,Java和Kotlin中标记参数和重载

    python kotlin 在多种语言之间跳来跳去可以帮助您注意到不同语言的习惯用法和最佳做法之间的某些差异. 比较有趣的差异之一与一个函数执行多项操作有关. Python 我们先来看一下Python ...

  4. python function if yield_Python中的yield关键字

    Python中的yield关键字 这是stackoverflow上一个关于yield关键字的问题以及它被推荐次数最高的一个答案 问题: Python中的yield关键字是什么?它是用来做什么的? 例如 ...

  5. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

  6. python在中小学教学中的应用-小学信息技术教学中进行Python 编程语言教学的策略...

    原标题:小学信息技术教学中进行Python 编程语言教学的策略 本文发表于 <数字教育> 2019年第2期(总第26期)实践案例栏目,页码:82-86.转载请注明出处. 摘 要:本文探讨在 ...

  7. python语言入门z-python中a z

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. def collatz(n): if n % 2 == 0: n=n2 ...

  8. python面试常见问题-Python面试中最常见的25个问题

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python是一个面向对象的解释型的交互式高级脚本语言.Python被设计成一种高可读性的语言,因为它大量 ...

  9. python在中小学教学中的应用-中小学Python教学的几点建议

    苗海荣 [内容摘要]随着信息化的不断深入和人工智能的兴起,Python逐渐取代其它编程语言走进中小学教材.如何利用这一工具锻炼学生的逻辑思维.增强信息技术意识和数据处理能力成为当前信息技术老师面临的一 ...

最新文章

  1. 有没有一只蜻蜓永远为你守候?
  2. 移动端自动化==Appium定位方式总结
  3. Surf算法学习心得(一)——算法原理
  4. python客户价值分析_[Python数据挖掘]第7章、航空公司客户价值分析
  5. pytorch教程龙曲良01-05
  6. 2017.0613.《计算机组成原理》总线控制-通信控制
  7. linux qtopia-2.2.0编译,qtopia-2.2.0在linux上的安装(基于mini2440)
  8. linux sql 语句菜鸟,Linux安装mysql
  9. oracle强制drop用户,强制Oracle Drop全局临时表
  10. PHP采集利器:phpQuery,像jQuery一样轻松采集内容
  11. linux测试wifi信噪比,无线网络中信噪比(SNR)计算
  12. 关于轻量级知识共享平台mm-wiki的使用
  13. day 32 子进程的开启 及其用法
  14. 大叔配萝莉/正太的电影一般都不会差。。。
  15. CSS 实现面包屑导航
  16. python画简便的图片-用python简单处理图片(5):图像直方图
  17. oracle数据库存储结构语句,oracle之物理数据库结构描述
  18. BSN-DDC基础网络的DID功能设计
  19. 跨域读写Cookie
  20. 顺利完成网页版体温单

热门文章

  1. 暗黑破坏神(背包)(内部模拟)
  2. Loj#143-[模板]质数判定【Miller-Rabin】
  3. P3369-[模板]普通平衡树【Splay】
  4. codeforces1497 D. Geniue(dp+图论)
  5. 各种有用的东西留言板
  6. mybatis源码阅读(四):mapper(dao)实例化
  7. SpringBoot2.1.9 分布式锁ShedLock不执行坑
  8. HighChart模拟点击series的name显示隐藏
  9. JS原型链与instanceof底层原理
  10. 汇编语言(十)之最小偶数