1. 程式人生 > 程式設計 >Python基於內建函式type建立新型別

Python基於內建函式type建立新型別

英文文件:

class type(object)

class type(name,bases,dict)

With one argument,return the type of an object. The return value is a type object and generally the same object as returned by object.__class__.

The isinstance() built-in function is recommended for testing the type of an object,because it takes subclasses into account.

With three arguments,return a new type object. This is essentially a dynamic form of the class statement. The namestring is the class name and becomes the __name__ attribute; the bases tuple itemizes the base classes and becomes the __bases__ attribute; and the dict dictionary is the namespace containing definitions for class body and is copied to a standard dictionary to become the __dict__ attribute.

  返回物件的型別,或者根據傳入的引數建立一個新的型別

說明:

  1. 函式只傳入一個引數時,返回引數物件的型別。 返回值是一個型別物件,通常與物件.__ class__返回的物件相同。

#定義型別A
>>> class A:
  name = 'defined in A'

#建立型別A例項a
>>> a = A()

#a.__class__屬性
>>> a.__class__
<class '__main__.A'>

#type(a)返回a的型別
>>> type(a)
<class '__main__.A'>

#測試型別
>>> type(a) == A
True

 2. 雖然可以通過type函式來檢測一個物件是否是某個型別的例項,但是更推薦使用isinstance函式,因為isinstance函式考慮了父類子類間繼承關係。

#定義型別B,繼承A
>>> class B(A):
  age = 2

#建立型別B的例項b
>>> b = B()

#使用type函式測試b是否是型別A,返回False
>>> type(b) == A
False

#使用isinstance函式測試b是否型別A,返回True
>>> isinstance(b,A)
True

 3. 函式另一種使用方式是傳入3個引數,函式將使用3個引數來建立一個新的型別。其中第一個引數name將用作新的型別的類名稱,即型別的__name__屬性;第二個引數是一個元組型別,其元素的型別均為類型別,將用作新建立型別的基類,即型別的__bases__屬性;第三個引數dict是一個字典,包含了新建立類的主體定義,即其值將複製到型別的__dict__屬性中。

#定義型別A,含有屬性InfoA
>>> class A(object):
  InfoA = 'some thing defined in A'

#定義型別B,含有屬性InfoB
>>> class B(object):
  InfoB = 'some thing defined in B'

#定義型別C,含有屬性InfoC
>>> class C(A,B):
  InfoC = 'some thing defined in C'

#使用type函式建立型別D,含有屬性InfoD
>>> D = type('D',(A,B),dict(InfoD='some thing defined in D'))

#C、D的型別
>>> C
<class '__main__.C'>
>>> D
<class '__main__.D'>

#分別建立型別C、型別D的例項
>>> c = C()
>>> d = D()

#分別輸出例項c、例項b的屬性
>>> (c.InfoA,c.InfoB,c.InfoC)
('some thing defined in A','some thing defined in B','some thing defined in C')
>>> (d.InfoA,d.InfoB,d.InfoD)
('some thing defined in A','some thing defined in D')

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。