问题描述
我想了解python(3.8.2)中的数据模型,所以也许有人可以用简单的词来解释为什么每种基本数据类型都是类对象并且具有如此多的属性和功能。
考虑以下代码:
num = 1337
type(num) # <class 'int'>
dir(num)
>>>
['__abs__','__add__','__and__',...
'real','to_bytes']
我可以这样做:
num.__add__(1)
>>> 1338
所以我的问题是:为什么这些函数是用户定义的变量的一部分,而这又没有太多开销呢?
解决方法
为什么有这么多方法:
Python是一种面向对象语言。它建立在彼此交互的对象上。也许没有特定的原因为什么Python必须是面向对象的,但是编写它的人必须决定它是哪种语言,然后他选择了这种类型。
在Python中,对象可以决定如何实现操作。这就是为什么您可以使用'str1' + 'str2'
或23 + 40
这样的自然语法的原因。请注意,它们都是用相同的方式编写的,但是会产生不同的结果,因为+
操作是在不同的对象上进行的。
关于内存管理:
如果对象没有决定如何实现操作,则逻辑仍必须存储在某个位置。它可能至少会占用一些内存。
问题是一个对象使用多少内存?为此,您可以使用sys.getsizeof
函数:
import sys
print(sys.getsizeof(int)) # Prints size in bytes
>>> 416
print(sys.getsizeof(1))
>>> 28
因此,类(int)的内存比对象(1)大得多。这意味着整数的实例比其类小得多,因此内存不会急剧膨胀。
,“一切都是Python中的对象”,因此“一切”(也许不完全是我所不知道的东西)是一个类实例,并且具有潜在的属性和方法。
那就是说,您必须知道,按照惯例,每个以__
开头的方法都被认为是私有的(并且几乎是受保护的),并且您不应该直接使用它。
每个以__
开头和结尾的方法都称为magic method,并且具有明确定义的作用。可以将它们视为绑定到对象生命周期中特定操作符或时刻的一种钩子。
例如__add__
是绑定到+
运算符的方法。进行加法时,实际上是在调用数字的__add__
方法,并给它另一个数字作为参数。
如您所见,您也可以根据需要直接调用__add__
方法,但不建议这样做。
Python是一种高级解释语言。它提供了许多功能和清晰的语法,使您可以专注于实际问题而不是实现细节。
这些设施并非无处不在,并且是内部数据模型(除其他外)提供的好处。 这种数据模型肯定不如专门为单个问题设计的定制手工C数据结构轻巧,但它在许多情况下是实用且可用的(并且在许多情况下仍然相当轻巧且性能良好)。
如果您对内存优化和极端性能感到担心,则可能应该使用C
或Go
这样的低级语言。
但是请记住,解决任何问题可能会花费更多时间:)