Python——內置類型


Python定義了豐富的數據類型,包括:

  數值型:int, float, complex

  序列:(iterable) str, unicode, tuple, list, bytearray, buffer, xrange

  集合:set, fronzeset

  映射:dict

  文件:file

  布爾值:True、False 和 bool() 函數,其中 bool() 函數將一個值轉變成布爾對象 True 或 False 。

  可調用對象:凡是可以使用 x() 調用 x 的對象 x ,稱為可調用的,x 可以是類型、函數、類型中定義了 __call__() 方法的實例等。

  None:

  memoryview:memoryview對象是Python2.7的新增對象,允許Python代碼訪問一個支持緩沖協議(buffer protocol)的對象它的內部數據,然后可以將其轉變為字節字符串或字符對應ASCII值的列表等。

  上下文管理器:上下文管理器用在 with 語句中,上下文管理協議(context management protocol)包括了 contextmanager.__enter__() 和  contextmanager.__exit__(exc_type, exc_val, exc_tb) 兩個方法。

  裝飾器:裝飾器實際上就是高階函數,屬於函數式編程的范疇,得益於Python中“一切皆對象”的思想,裝飾器接受函數對象作為參數,返回的則是一個修改后的函數對象。

 

  其他:

    python中,模塊、類型、函數、實例、都是對象,可謂一切皆對象,此外,還有 code 對象, Type 對象即一個對象所屬的類型,通過 type() 函數來獲取;

類型

名稱 構造方法 介紹

basestring

    抽象的(不能實例化)的類型,是str和unicode類型的基類型,可以通過isinstance(x, basestring)來判斷x是不是str或者unicode類型。 
bool    bool(x)

用來計算表達式x並返回x是True還是False。bool是int的子類,只有兩個實例:True和False,True和False的值分別為1和0,但str(True)和str(False)的值分別是'True'和'False'。

buffer    buffer(obj, offset=0, size=-1)

 obj必須是string或者是array,該函數返回一個從offset開始,大小為size的obj的部分只讀的buffer對象,如果size<0,或者obj的大小小於size,則會從offset開始直達obj結尾。

classmethod  類方法 classmethod(function)

返回一個類方法,只能在類的定義中使用,可以用@classmethod替代。 

code 代碼對象 compile(source, filename, mode[, flags[, dont_inherit]])

code 對象一般通過內置函數 compile() 方法創建,也可以通過一個函數的func_code屬性查看,關於code對象的細節,在下文介紹。

complex  復數  complex(real, imag=0)

 

dict  字典  dict(x={})

如果參數x是一個字典,那么返回它的一個拷貝,參數x也可以是一個可迭代對象,其中每一個元素是一個二元組,如:x = [('a', 1), ('b', 2)] 

enumerate  枚舉 enumerate(iterable, start=0)

從一個可迭代對象生成一個新的迭代器,這個迭代器的每一個item都是一個二元組,二元組的首元是從start開始連續遞增的下標,而二元組的次元是參數可迭代對象從一個開始的內部元素。 

open  文件  open(filename, mode='r', bufferzies=-1)

 以參數mode形式打開指定的filename,返回一個file對象。

float  浮點型  float(x)

 把數字或合適的字符串轉換成浮點數。

frozenset    frozenset(seq=[])

 返回一個凍結集合對象,關於set和frozenset的討論請見 這篇博文

int  整型  int(x[, radix])

 將數字或合適的字符串轉換成整數,當x是一個字符串時,radix需要指定,表示轉換時的基數,默認是10,實際上轉換基數可以介於2和36之間

list  列表  list(seq=[])

 如果參數seq是一個列表,則返回它的拷貝;參數seq必須是一個可迭代對象,list()返回和這個可迭代對象具有相同順序相同元素的列表。

long  長整型  long(x [, radix])

 將數字或合適的字符串轉換成長整數

object    object()

 返回一個最基本的類型的新實例。

property  屬性  property(fget=None, fset=None, fdel=None, doc=None)  只能在類定義中使用,通常使用裝飾器@property
reversed    reversed(seq)

返回一個迭代器,這個迭代器和序列seq有着相反的元素對象,這個方法不會改變參數seq 

set  集合  set(seq=[])

返回一個set對象,set對象是可變的,如果seq是一個set對象,那么set(seq)返回它的拷貝,關於內置類型set和frozenset的詳細討論參考這篇博文

slice  切片  slice([start, ] stop[, step])

返回一個slice對象, 

staticmethod  靜態方法  staticmethod(function) 只在類定義中調用,返回一個靜態方法對象,或使用裝飾器@staticmethod
str plain string  str(obj)

如果obj本身就是str類型的,則返回obj對象;否則,返回obj對象的面向讀者的形式,主要區別於repr面向python解釋器的形式

super   super(cls, obj)

返回參數obj的父類的對象,obj必須是cls或cls子類的實例,這個方法主要用於調用父類的方法,這個函數只在方法代碼中調用 

tuple 元組 tuple(seq)

如果seq就是tuple對象,則返回它的拷貝;否則,返回一個和seq具有相同順序相同元素的tuple對象,seq必須是一個可迭代對象 

type   type(obj)

type(x)等價於x.__class__,即x所屬的類型對象。

type 本身是一個內置的類型,也可以作為一個工廠對象,返回的是類型對象。Python中的類型對象只要支持相等與否的比較(equality comparison)和字符串表現形式即可。

按照面向對象的特點,類型對象又常常是可調用的,比如內置的 int, float, list 等等,調用這些對象可以創建他們的實例,同時類型對象可以被繼承(subclass),這都是類型的基本特征。

unicode unicode string unicode(string [,codec, [, errors]]) 返回一個unicode字符串對象 
xrange   xrange([start, ] stop [,step=1])

 range()返回一個列表對象,xrange()則返回一個可迭代xrange對象,這個對象不像range()返回的list那樣將所有的元素都事先生成好放在內存中,而是在迭代的過程中每次生成一個,從而對於遍歷大數據量的數字序列時,xrange在內存上具有顯著優勢。Python 3以后,不再使用xrange這個概念,而是將range基於Python 2中的xrange改良,使得Python 3 中range的功能更強大。

 

Python中的 code 對象

  我們首先看一下內置函數 compile() 的介紹:

compile(source, filename, mode[, flags[, dont_inherit]]) -> code object

Compile the source string (a Python module, statement or expression) into a code object that can be executed by the exec statement or eval().
The filename will be used for run-time error messages.
The mode must be 'exec' to compile a module, 'single' to compile a single (interactive) statement, or 'eval' to compile an expression.
The flags argument, if present, controls which future statements influence the compilation of the code.
The dont_inherit argument, if non-zero, stops the compilation inheriting the effects of any future statements in effect in the code calling compile; if absent or zero these statements do influence the compilation, in addition to any features explicitly specified.

 

  總結起來就是:

  compile()函數用於構造一個 code 對象,code對象可以作為 exec() 和 eval() 的參數;

  對於任意一個Python函數而言,其 func_code 屬性就是一個 code 對象,該對象是不可調用的,但是可以將它綁定給另一個具有相同參數個數的函數對象,從而創建一個新的函數對象:

>>> f = lambda x, y: x + y
>>> f.func_code
<code object <lambda> at 0000000001D74530, file "<stdin>", line 1>
>>> code_obj = f.func_code
>>> def g(x, y): pass
...
>>> g.func_code = code_obj
>>> g(1, 9)
10

  原本我們是沒有定義函數 g 的函數體的,但是通過替換它的 func_code 屬性,可以將不可調用的 code 對象替換成一個可調用的函數,是不是有一種金蟬脫殼的感覺呢。

 

Python的 types 模塊

  types模塊的屬性是 Python的內置類型,包括:

>>> dir(types)
['BooleanType', 'BufferType', 'BuiltinFunctionType', 'BuiltinMethodType', 'ClassType', 'CodeType', 'ComplexType', 'DictProxyType', 'DictType', 'DictionaryType', 'EllipsisType', 'FileType', 'FloatType', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'InstanceType', 'IntType', 'LambdaType', 'ListType', 'LongType', 'MemberDescriptorType', 'MethodType', 'ModuleType', 'NoneType', 'NotImplementedType', 'ObjectType', 'SliceType', 'StringType', 'StringTypes', 'TracebackType', 'TupleType', 'TypeType', 'UnboundMethodType', 'UnicodeType', 'XRangeType', '__builtins__', '__doc__', '__file__', '__name__', '__package__']

   如何知道這些屬性其實是 Python 的內置類型呢?

例如:

>>> types.DictionaryType
<type 'dict'>
>>> types.DictType
<type 'dict'>
>>> type({})
<type 'dict'>

  可見,types.DictType 和 types.DictionaryType 其實就是內置類型 dict,也就是 type({}) 。

 

Python 類型的方法查找路徑(Method Resolution Order)

  Python支持多重繼承,當引用一個繼承了多個類型的實例的屬性時,如何確定屬性、方法的查找順序,稱為方法查找路徑。

  Python中一個繼承自多個類型的類使用一種稱為 C3 的方法查找路徑(The Python 2.3 Method Resolution Order),通過一個自定義類型的 __mro__ 屬性可以查看該類型的方法查找路徑:

>>> class D(object):
...     d = 100
...
>>> class B(D):
...     pass
...
>>> class C(D):
...     pass
...
>>> class A(B, C): pass
...
>>> A.__mro__
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <type 'object'>)

  在Python中,只能查看一個類型(而不是實例)的 __mro__ 屬性,該屬性是只讀的,其中各個類型顯示的順序,就是當訪問該類型的屬性、方法時查找的順序。

  對於一個實例而言,如果實例中綁定了某個屬性,那么在屬性查找時,實例綁定的屬性先於類中定義的屬性。

 

Python 中的 metaclass

  • metaclass 是 class 對象的“類型”,class 對象則是 metaclass 對象的實例,從而可以在 metaclass 中控制 class 的創建過程;
  • 要定義一個 metaclass M,只要令 M 繼承自內置類型 type 即可;
  • 要為類型 C 指定其 metaclass 為 M,只要在 C 的 class body 中添加 __metaclass__ = M 即可;
  • M 在 創建 C 的時候,首先通過 M.__new__(M, namestring, t, d) 新建一個實例 C,然后通過 M.__init__(C, namestring, t, d) 初始化這個新的 class 對象 C。其中,namestring 是新創建類型的名稱,t是一個元組,包括在定義 C 時指定的它的基類,d 就是要為 C 添加的屬性字典。

 

Python中 type 和 object 的關系與區別

  Python 中有兩個非常有趣的概念——type 和 object,這里梳理一下他們的關系:

  • type 是自己的實例(所以type是一個內置的類型,也是自己的實例。。。);
  • type 是一個可以用來創建新的類型的 metaclass;所以他是Python中一切其他類型的 類型(對應於__class__屬性);
  • object 是 type 的實例,而作為類型,type 又繼承了 object。。。所以 object 是所有一切其他Python類型的 基類(對應於__base__屬性)
  • 因此對於一個類型對象而言,它的基類是 object ,而它的類型則是 type,這是兩個概念;

  怎么樣,夠暈吧,下面的例子可以解釋他們之間的關系,

例如:

>>> isinstance(object, type)
True
>>> issubclass(type, object)
True
>>> type(object)
<type 'type'>
>>> type(type)
<type 'type'>
>>> object.__base__
>>> type.__base__
<type 'object'>
>>>

  這里掛上一張示意圖,其中實線箭頭代表類型繼承,虛線箭頭則代表實例化,從而可以看出其中的一致性。

關於這個雞生蛋蛋生雞的有趣討論,可以參考:http://www.cnblogs.com/txw1958/archive/2012/11/30/Python-Types-and-Objects.html

 

所有的序列(Sequence)都是可迭代的(Iterable),但是可迭代對象卻不止Sequence:

  • 序列一定是有序的,但是可迭代對象卻不一定,例如set對象,可以被遍歷,但是卻無序,因此無法索引,切片等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM