抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载

admin 1个月前 ( 10-31 22:10 ) 0条评论
摘要: 全文共9402字,预计学习时长19分钟图片来源:https://unsplash.com/@marcelheilPython是数据科学中一种十分常用的编程语言。对一些人来讲,它的语...
全文共9402字,估计学习时长19分钟

图片来历:https://unsplash.com/@marcelheil


Python是数据科学中一种十分常用的编程言语。对一些人来讲,它的言语灵敏、可读性强,对另一些人来讲,它简略易上手,对大多数人来讲,是由于它的多面性。

咱们将Python称为多面言语,由于它答应运用四种不同的编码标准进行编码:功用性、指令性、面向方针和面向进程。这些编码风格被正式称为编程典范(https://en.wikipedia.org/wiki/Programming_paradigm),代表了一种依据言语特性对言语进行分类的办法。



本文将对面向方针编程( OOP )(https://en.wikipedia.org/wiki/Object-oriented_programming)进行研讨。



什么是面向方针编程( OOP )?

OOP是一种根据方针概念的编程范式。在计算机科学中,“方针”一词能够指代不同概念,但基本上,它是标识符所引证的内存值(https://en.wikipedia.org/wiki抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载/Object_(computer_science))。


在OOP的履行环境中,方针指状况(变量)和行为(办法)的组合。面向方针办法的方针是创立可重复运用的软件,以下四个特征使其更易保护:封装、笼统、承继和多态。


还能够进一步区别面向方针言语,例如,根据类和根据原型。

在根据类的OOP中,方针是类的实例。类是关于怎么界说某些内容的蓝图,但它不会供给内容自身——它仅仅供给结构。


学习战略


有许多办法能够用来学习和操练OOP,因有必要挑选其间一种,所以笔者决议选用莎士比亚的《罗密欧与朱丽叶》的故事线,制造一个简略的根据文本的游戏。具体进程如下:

1. 写下故事

2. 指出问题

3. 确认实体——这些是类别

4. 创立实体层次结构

5. 确认实体的功用

6. 编写测验

7. 检查测验是否成功——因未编写过任何代码,所以开端会呈现过错!

8. 编写代码

9. 重复!重构!精粹!

这个进程不是原封不动的,也不是注定要被它牵着鼻子走。这一系列进程协助笔者开端了编程之路。面向方针不仅仅是一种编程范式,仍是一种处理问题的办法,虽然它并非没有谴责,但在构建杂乱体系时却是一个很好的挑选。


兔子洞(The Rabbit Hole)


请注意进程6:编写测验。现在,这个不是笔者开端的进程。笔者正方案给各类别编码。但在研讨OOP时,笔者发现了测验驱动开发( TDD )这一概念。

TDD是一种编程实践,开端于程序每个功用所进行的测验的规划和开发。这样,在开端编写代码之前,你就不得不考虑其标准、要求或规划。换句话说,在编写任何代码之前,都要编写代码来测验代码。

是不是感到疑惑不解?笔者也是。但做这个操练是彻底值得的。


测验悲瑟独弦琴驱动开发和单元测验


TDD的进程十分简略:

图片来自Kanchan Kulkarni的TDD教程(https://www.guru99.com/test-driven-development.html)


1. 写出测验

2. 运转测验

3. 写下代码

4. 运转测验

5. 重构代码

6. 重复进程

在这个比如中,笔者运用单元测验(http://softwaretestingfundamentals.com/unit-testing/)进行TDD。单元测验是软件测验的榜首级,其意图是验证程序中的每个单元是否按规划履行。能够运用不同的结构来履行单元测验。


人们关于TDD持有两种不同观念。就我个人的阅历而言,TDD的长处如下:

在毫无方向地开端输入代码之前,TDD迫使人们有必要考虑要处理的问题。

在根据类别的OOP的特别情况下,它能协助了解每个类别内容。如责任是什么?有必要知道什么?——方针是低耦合和高内聚性时,这变得更加息息苏进园相关。

虽然一开端它可能会减慢速度,但从久远来看,它经过最小化调试时刻来节省时刻。

它鼓舞更好的规划,使代码更简单保护、削减冗余(不写重复代码!),并在需求时安全地重构。

它是一个动态文档——只需检查测验,就能了解每个单元应该做什么,如此一来,代码就能自证其明。


罗密欧与朱丽叶——代码与测验


在考虑了游戏的故事性之后,笔者决议选用两个不同的故事线:经典桥段和特殊桥段。榜首个是人们熟知的罗密欧与朱丽叶,第二个故事对咱们来说则较为生疏。

故事组织(创立不同类别的引证)如下:

场景:蒙面舞会、阳台、决战,组织、药剂师、卡普莱特墓和特殊结局。该“场景”有两个主要责任,艺术人生导演溺水即为玩家描绘场景,以及所以非问题提示玩家然后获取信息输入。

地图:地图就像一个有限状况机(https://en.wikipedia.org/wiki/Determini瑷呦趴stic_finite_automaton)。它具有有限的状况(场景)、转化函数(从一个场景移动到另一个场景)和开端状况(榜首个场景)。


故事线:界说两个仅有常量值。

从场景的界说中能够看到,一切场景都有相同的责任,只要它们的内容发生了改变(场景的描绘和提示)。这梁心怡便是为什么要运用承继的概念。这个概念答应界说一个类,该类别从另一个类中承继了一切办法和特点;在这种情况下,不重复写代码至关重要。

class Storyline(Enum):
CLASSIC = "classic"
ALTERNATIVE = "alternative"


关于故事线这一类别,笔者运用了Python’s enumeration type(https://docs.python.org/3/library/enum.html)或enum。在文档中,它们的界说为“一组绑定到仅有常量值的符号名(成员)。在枚举中,成员能够按标识进行比较,枚举自身能够循环拜访。”

接下来,咱们有Sence类和MockSence类。测验代码中有两个值得注意的特征:1.运用MockMap类;2.创立TestScene类以测验Scene类。在单元测验阶段,将创立一个Test类为每个类编写测验。

Class Scene(object):
a_map = None

def __init__(self, a_map):
self.a_map = a_map
def get_message(self):
return """
This scene is yet to be initialized
"""
def get_prompt(self):
return """
This scene is yet to be initialized
"""

def enter(self):
self.print_description()
self.puzrorompt_user()

def print_description(self):
print(dedent(self.get_message()))
def prompt_user(self):
input_from_user = input(self.get_prompt()).lower()
if input_from_user == "yes":
self.a_map.advance_scene(Storyline.CLASSIC)
elif input_from_user == "no":
self.a_map.advance_scene(Storyline.ALTERNATIVE)
self.a_map.play()


import unittest
from unittest.mock import patch, mock_open
import sys
import io
from romeo_and_juliet import *
class MockMap(Map):
storyline = None
play_executed = False
def advance_scene(self, a_storyline):
self.storyline = a_storyline
def play(self):
self.play_executed = True

class TestScene(unittest.TestCase):
def test_print_description(self):
a_scene = Scene(Map())
# Capturing the standard output as a test harness.
capturedOutput = io.StringIO()
sys.stdout = capturedOutput
a_scene.print_description()
self.assertEqual(capturedOutput.getvalue(), dedent("""
This scene is yet to be initialized\n
"""))
# Releasing standard output.
sys.stdout = sys.__stdout__

def test_prompt_user(self):
a_map = MockMap()
a_scene = Scene(a_map)
with patch("builtins.input", return_抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载value = "yes"):
a_scene.prompt_user()
self.assertEqual(a_map.storyline, Storyline.CLASSIC)
with patch("builtins.input", return_value = "no"):
a_scene.prompt_user()
self.assertEqual(a_map.storyline, Storyline.ALTERNATIVE)
self.assertTrue(a_map.play_executed)


最终,来看看Map类和TestMap类。和平常相同,咱们会创立一个模仿测验,但在本例中,是为Scene类创立一个MockScene类。

class Map(object):
scenes = None
c抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载urrent_scene = None
def __init__(self):
self.scenes = {
"the_masked_ball": TheMaskedBall(self),
"the_balcony": TheBalcony(self),
"the_duel": TheDuel(self),
"the_arrangement": TheArrangement(self),
"the_apothecary": TheApothecary(self),
"the_capulet_tomb": TheCapuletTomb(self),
"the_alternative_ending深圳巨发科技有限公司": TheAlternativeEnding(self)
}
self.current_scene = self.scenes["the_masked_ball"]
def get_current_scene(self):
return self.current_scene
def play(self):
self.current_scene.enter()
def advance_scene(self, storyline):
if storyline == Storyline.CLASSIC:
if self.current_scene == self.scenes["the_masked_ball"]:
self.current_scene = self.scenes["the_balcony"]
elif self.current_scene == self.scenes["the_balcony"]:
self.current_scene = self.scenes["the_duel"]
elif self.current_scene == self.scenes["the_duel"]:
self.current_scene = self.scenes["the_arrangement"]
elif self.current_scene == self.scenes["the_arrangement"]:
self.current_scene = self.scenes["the_apothecary"]
e抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载lif self.current_scene == s异界之九转龙象功elf.scenes["the_apothecary"]:
self.current_scene = self.scenes["the_capulet_tomb"]
elif self.current_scene == self.scenes["the_capulet_tomb"]抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载:
raise Exception
if storylin重庆水旱微耕机e == Storyline.ALTERNATIVE:
if self.current_scene == self.scenes["the_masked_ball"]:
self.current_scene = s孔和尚有话说elf.scenes["the_alternative_ending"]
elif self.current_scene == self.scenes["the_balcony"]:
self.current_scene = self.scenes["the_alternative_ending"]
elif self.current_scene == s科斯塔沙滩独练elf.scenes["the_duel"]:
self.current_scene = self.scenes["the_alternative_ending"]
elif self.current_scene == self.scenes["the_arrangement"]:
self.current_scene = self.scenes["the_alternative_ending"]
elif self.current_scene == self.scenes["the_apothecary"]:
self.current_scene = self.scenes["the_alternative_ending"]
elif self.current_scene == self.scenes["the_alternative_ending"]:
raise Exception


class MockScene(Scene):
was_entered = False
def enter(self):
self.was_entered = True
class TestMap(unittest.TestCase):
def test_play(self):
a_map = Map()
mock_scene =octupus MockScene(a_map)
a_map.current_scene = mock_scene
a_map.play()
self.assertTrue(mock_scene.was_entered)
抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载def test_initial_state(self):
a_map = Map()
self.assertIsInstance(a_map.get_current_scene(), TheMaskedBall)

def test_advance_scene_classic(self):
a_map = Map()
self.assertIsInstance(a_map.get_current_scene(), TheMaskedBall)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheBalcony)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_curren爱丽丝伊菲迪亚公主t_scene(), TheDuel)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheArrangement)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheApothecary)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheCapuletTomb)
with self.assertRaises(Exception):
a_map.advance_scene(Storyline.CLASSIC)
def test_advance_scene_alternative_one(self):
a_map = Map()
self.assertIsInstance(a_map.get_current_scene(), TheMaskedBall)
a_map.advance_scene(Storylin玉医玄九霄e.ALTERNATIVE)
self.assertIsInstance(a_map.get_current_scene(), TheAlternativeEnding)
with self.assertRaises(Exception):
a_map.advance_scene(Storyline.ALTERNATIVE)

def test_advance_scene_alternative_two(self):
a_map = Map()
self.assertIsInstance(a_ma抽签,瘟疫公司,极品修真强少-竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载p.get_current_scene(), TheMaskedBall)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheBalcony)
a_map.advance_scene(Storyline.ALTERNATIVE)
self.assertIsInstance(a_map.get_current_scene(), TheAlternativeEnding)
with self.assertRaises(Exception):
a_map.advance_scene(Storyline.ALTERNATIVE)
def test_advance_scene_alternative_three(self):
a_map = 昭和枯草哀歌Map()
self.assertIsInstance(a_map.get_current_scene(), TheMaskedBall)
a主力校草美男团_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheBalcony)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheDuel)
a_map.advance_scene(Storyline.ALTERNATIVE)
self.assertIsInstance(a_map.get_current_scene(), TheAlternativeEnding)
with self.assertRaises(Exception):
a_map.advance_scene(Storyline.ALTERNATIVE)
def test_advance_scene_alternative_four(self):
a_map = Map()
self.assertIsInstance(a_map.get_current_scene(), TheMaskedBall)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheBalcony)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene公孙狷介(), TheDuel)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheArrangement)
a_map.advance_scene(Storyline.ALTERNATIVE)
self.assertIsInstance(a_map.get_current_scene(), TheAlternativeEnding)
with self.assertRaises(Exception):
a_map.advance_scene(Storyline.ALTERNATIVE)
def test_advance_scene_alternative_five(self):
a_map = Map()
self.assertIsInstance(a_map.get_current_scene(), TheMaskedBall)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheBalcony)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheDuel)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheArrangement)
a_map.advance_scene(Storyline.CLASSIC)
self.assertIsInstance(a_map.get_current_scene(), TheApothecary)
a_map.advance_scene(Storyline.ALTERNATIVE)
self.assertIsInstance(a_map.get_current_scene(), TheAlteMide448rnativeEn特莱雅ding)
with self.assertRaises(Exception):
a_map.advance_scene(Storyline.ALTERNATIVE)

留言 点赞 重视

咱们一同共享AI学习与开展的干货

编译组:余书敏、张璐瑶

相关链接:

https://towardsdatascience.com/object-oriented-programming-and-the-magic-of-test-driven-development-d377acae85fa

如需转载,请后台留言,恪守转载标准

文章版权及转载声明:

作者:admin本文地址:http://sxlgdx.cn/articles/1859.html发布于 1个月前 ( 10-31 22:10 )
文章转载或复制请以超链接形式并注明出处竞技宝app苹果_竞技宝app苹果ios下载_竞技宝app苹果版下载