python - Python套件,软件包,模块,TestCase和TestSuite的差异

标签 python unit-testing package suite

最佳的揣测:


方法-def(自我,也许是SomeVariables);实现某些目的的代码行
功能-与方法相同,但返回值
类-方法/功能组
模块-脚本或一个或多个类。基本上是.py文件。
包-包含模块的文件夹,以及__init__.py文件。
套件-按照惯例,只是一个单词而已
TestCase-单元测试的等效功能
TestSuite-相当于类(或模块?)的单元测试


我的问题是:这是完全正确的吗?我是否错过了该列表中的任何层次结构块?

最佳答案

我感觉到您正在放入实际上不存在的差异。确实没有这样的层次结构。在python中,一切都是对象。这不是一些抽象的概念,但是对于使用python时应该如何考虑创建的构造来说,这是非常基础的。一个对象只是一堆其他对象。是否使用new-style classes略有微妙之处,但是在没有充分理由的情况下,只需使用并假设使用新样式的类即可。下面的所有内容都是假设采用新型的类。

如果对象是callable,则可以使用一对大括号的调用语法对其进行调用,并且其中包含以下参数:my_callable(arg1, arg2)。为了可调用,对象需要实现__call__方法(否则,必须在其C级类型定义中设置正确的字段)。

在python中,对象具有与之关联的type。类型描述了对象的构造方式。因此,例如,列表对象的类型为list,而功能对象的类型为function。类型本身的类型为type。您可以使用内置函数type()查找类型。可以在python documentation中找到所有内置类型的列表。类型实际上是可调用的对象,并用于创建给定类型的实例。

正确,现在已经确定,给定对象的性质由其类型定义。这描述了它所包含的对象。然后回到您的问题:

首先,组成某个对象的一堆对象称为该对象的属性。这些属性可以是任何东西,但是它们通常由方法和某种存储状态的方式(可能是诸如intlist的类型)组成。

functionfunction类型的对象。至关重要的是,这意味着它具有__call__方法作为可调用的属性(__call__方法也是本身具有__call__方法的对象。它一直位于__call__之下;)

在python世界中,class可以被认为是一种类型,但通常用于指代非内置类型。这些对象用于创建其他对象。您可以使用class关键字定义自己的类,并创建一个新样式的类,您必须从object继承(或其他一些新样式的类)。继承时,您将创建一个获取父类型的所有特征的类型,然后可以覆盖所需的位(并且可以覆盖所需的任何位!)。当您通过调用实例化一个类(或更一般地说,一个类型)时,将返回由该类创建的另一个对象(可以通过修改类对象以怪异和疯狂的方式更改创建返回对象的方式)。

method是一种特殊的函数类型,使用属性符号来调用。也就是说,在创建它时,会将两个额外的属性添加到方法中(请记住这是一个对象!),分别称为im_selfim_funcim_self我将用几句话来描述。 im_func是实现该方法的函数。当调用方法时,例如foo.my_method(10),这等效于调用foo.my_method.im_func(im_self, 10)。这就是为什么在定义方法时,使用似乎似乎没有使用的额外第一个参数(如self)来定义它的原因。

在定义类时编写一堆方法时,这些方法将成为未绑定的方法。创建该类的实例时,这些方法将被绑定。调用绑定方法时,会为您添加im_self参数作为绑定方法所驻留的对象。您仍然可以调用类的未绑定方法,但是您需要显式添加类实例作为第一个参数:

class Foo(object):

    def bar(self):
        print self
        print self.bar
        print self.bar.im_self # prints the same as self


我们可以显示出调用bar方法的各种表现形式时会发生什么:

>>> a = Foo()
>>> a.bar()
<__main__.Foo object at 0x179b610>
<bound method Foo.bar of <__main__.Foo object at 0x179b610>>
<__main__.Foo object at 0x179b610>
>>> Foo.bar()
TypeError: unbound method bar() must be called with Foo instance as first argument (got nothing instead)
>>> Foo.bar(a)
<__main__.Foo object at 0x179b610>
<bound method Foo.bar of <__main__.Foo object at 0x179b610>>
<__main__.Foo object at 0x179b610>


综上所述,我们可以定义一个类,如下所示:

class MyFoo(object):
    a = 10
    def bar(self):
        print self.a


这将生成一个具有2个属性的类:a(它是值10的整数)和bar,这是一个未绑定的方法。我们可以看到MyFoo.a仅为10。

我们可以在运行时在类方法之内和之外创建额外的属性。考虑以下:

class MyFoo(object):
    a = 10

    def __init__(self):
        self.b = 20

    def bar(self):
        print self.a
        print self.b

    def eep(self):
        print self.c


__init__只是从类创建对象后立即调用的方法。

>>> foo = Foo()
>>> foo.bar()
10
20
>>> foo.eep()
AttributeError: 'MyFoo' object has no attribute 'c'
>>> foo.c = 30
>>> foo.eep()
30


本示例显示了两种在运行时(即从对象的类创建对象之后)向类实例添加属性的方法。

我希望您能看到,TestCase和TestSuite只是用于创建测试对象的类。除了它们碰巧具有一些编写测试的有用功能外,它们没有什么特别的。您可以继承并覆盖您的内心内容!

关于您的特定观点,方法和函数都可以返回他们想要的任何东西。

您对模块,软件包和套件的描述似乎很不错。注意模块也是对象!

关于python - Python套件,软件包,模块,TestCase和TestSuite的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859716/

相关文章:

Python 相对导入和包

java - 如何安全移动软件包 intellij?

python - 读取与类继承者定义相关的文件

Python 导入优先级 : packages or modules?

python - 你能在kivy中获取设备的物理尺寸吗?

unit-testing - NestJS 模拟返回 Guard 的 Mixin

unit-testing - 如何从 xml 配置中的 PHPUnit 测试套件中排除文件?

unit-testing - 大量的单元和集成测试是否会使架构更改变得困难?

python - 滚动到 ScrolledWindow/TextView 的末尾

python - 狮身人面像 : Remove package and module name for specific function