最佳的揣测:
方法-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中找到所有内置类型的列表。类型实际上是可调用的对象,并用于创建给定类型的实例。
正确,现在已经确定,给定对象的性质由其类型定义。这描述了它所包含的对象。然后回到您的问题:
首先,组成某个对象的一堆对象称为该对象的属性。这些属性可以是任何东西,但是它们通常由方法和某种存储状态的方式(可能是诸如int
或list
的类型)组成。
function是function
类型的对象。至关重要的是,这意味着它具有__call__
方法作为可调用的属性(__call__
方法也是本身具有__call__
方法的对象。它一直位于__call__
之下;)
在python世界中,class可以被认为是一种类型,但通常用于指代非内置类型。这些对象用于创建其他对象。您可以使用class关键字定义自己的类,并创建一个新样式的类,您必须从object
继承(或其他一些新样式的类)。继承时,您将创建一个获取父类型的所有特征的类型,然后可以覆盖所需的位(并且可以覆盖所需的任何位!)。当您通过调用实例化一个类(或更一般地说,一个类型)时,将返回由该类创建的另一个对象(可以通过修改类对象以怪异和疯狂的方式更改创建返回对象的方式)。
method是一种特殊的函数类型,使用属性符号来调用。也就是说,在创建它时,会将两个额外的属性添加到方法中(请记住这是一个对象!),分别称为im_self
和im_func
。 im_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/