python類型定義
A. python定義模型
學python的人都知道,python中一切皆是對象,如class生成的對象是對象,class本身也是對象,int是對象,str是對象,dict是對象...。所以,我很好奇,python是怎樣實現這些對象的?帶著這份好奇,我決定去看看python的源碼,畢竟源碼才是滿足自己好奇心最直接的方法。
在object.h文件中,定義了兩種數據結構PyObject和PyVarObject,代碼如下:
1 #define PyObject_HEAD 2 Py_ssize_t ob_refcnt; 3 struct _typeobject *ob_type; 4 5 #define PyObject_VAR_HEAD 6 PyObject_HEAD 7 Py_ssize_t ob_size; 8 9 typedef struct _object {10 PyObject_HEAD11 } PyObject;12 13 typedef struct {14 PyObject_VAR_HEAD15 } PyVarObject;
這兩種數據結構分別對應python的兩種對象:固定長度對象和可變長度對象。python中的所有對象都屬於這兩種對象中的一種,如int,float是固定長度對象,list,str,dict是可變長度對象。從上面兩種對象數據結構定義來看,可變長度對象和固定長度對象的頭都是PyObject結構體,也就是說python中所有對象的開頭都包含這個結構體,並且可以用PyObject *指針來訪問任何對象,這種訪問對象的方法在python的源碼中隨處可見。PyObject結構體包含兩個成員,ob_refcnt和ob_type指針。ob_refcnt用來表示對象被引用的次數,當ob_refcnt == 0時,這個對象會被立即銷毀;ob_type指針指向了一個_typeobject類型的結構體,表示對象所屬的類型,也就是生成該對象的類型,這其實很類似於面向對象中類與實例的關系,PyObject是某個類的實例,ob_type表示這個類。但與面向對象不同的是,ob_type本身也是個對象,我們來看下_typeobject的定義:
1 typedef struct _typeobject { 2 PyObject_VAR_HEAD 3 const char *tp_name; /*類型名 */ 4 Py_ssize_t tp_basicsize, tp_itemsize; /* 實例化對象的大小 */ 5 6 /* 標准方法 */ 7 8 destructor tp_dealloc; 9 printfunc tp_print;10 getattrfunc tp_getattr;11 setattrfunc tp_setattr;12 cmpfunc tp_compare;13 reprfunc tp_repr;14 15 /* 標准類(數值類,列表類,dict類)方法*/16 17 PyNumberMethods *tp_as_number;18 PySequenceMethods *tp_as_sequence;19 PyMappingMethods *tp_as_mapping;20 21 /* 其它標准方法*/22 23 hashfunc tp_hash;24 ternaryfunc tp_call;25 reprfunc tp_str;26 getattrofunc tp_getattro;27 setattrofunc tp_setattro;28 ...
29 } PyTypeObject;
從上面定義來看,_typeobject的開頭也包含了PyObject結構體,所以它也是一個對象,既然它也是一個對象,那麼按照面向對象的理解,它又是誰來生成的呢?答案是所有PyTypeObject對象都是通過PyType_Type來生成的,包括PyType_Type本身,因為PyType_Type也是PyTypeObject對象,有點繞。PyType_Type的定義是通過將PyType_Type聲明為全局靜態變數實現的,具體如下:
1 PyTypeObject PyType_Type = { 2 PyVarObject_HEAD_INIT(&PyType_Type, 0) 3 "type", /* tp_name */ 4 sizeof(PyHeapTypeObject), /* tp_basicsize */ 5 sizeof(PyMemberDef), /* tp_itemsize */ 6 (destructor)type_dealloc, /* tp_dealloc */ 7 0, /* tp_print */ 8 0, /* tp_getattr */ 9 0, /* tp_setattr */10 0, /* tp_compare */11 (reprfunc)type_repr, /* tp_repr */12 0, /* tp_as_number */13 0, /* tp_as_sequence */14 0, /* tp_as_mapping */15 (hashfunc)_Py_HashPointer, /* tp_hash */16 (ternaryfunc)type_call, /* tp_call */17 0, /* tp_str */18 (getattrofunc)type_getattro, /* tp_getattro */19 (setattrofunc)type_setattro, /* tp_setattro */20 0, /* tp_as_buffer */21 ...22 }
從PyType_Type定義來看,ob_type被初始化為它自己的地址,所以PyType_Type的類型就是自己。從python源碼實現來看,所有PyTypeObject的ob_type都會指向PyType_Type對象,所以PyType_Type是所有類型的類型,稱之為元類。python中定義了很多內建的類型對象,如PyInt_Type (int類型),PyStr_Type (str類型),PyDict_Type(dict類型) 類型對象,下面看下PyInt_Type類型的定義:
1 PyTypeObject PyInt_Type = { 2 PyVarObject_HEAD_INIT(&PyType_Type, 0) 3 "int", 4 sizeof(PyIntObject), 5 0, 6 (destructor)int_dealloc, /* tp_dealloc */ 7 (printfunc)int_print, /* tp_print */ 8 0, /* tp_getattr */ 9 0, /* tp_setattr */10 (cmpfunc)int_compare, /* tp_compare */11 (reprfunc)int_to_decimal_string, /* tp_repr */12 &int_as_number, /* tp_as_number */13 0, /* tp_as_sequence */14 0, /* tp_as_mapping */15 (hashfunc)int_hash, /* tp_hash */16 0, /* tp_call */17 ...18 };
從PyInt_Type定義來看,它主要包含了int數據類型相關的方法。PyInt_Type類型對象的初始化和PyType_Type類型類似,PyInt_Type類型的定義也是通過全局靜態變數的方式實現的,除了PyInt_Type了下,所有python內建類型都是以這種方式定義的。這些類型產生的對象都會共享這些類型對象,包括這些類型定義的方法。
在python中,怎樣查看對象的類型呢?有兩種方法,一種是直接type:
1 >>> x = 12 >>> type(x)3 <type 'int'>
另一種是通過對象的__class__屬性:
1 >>> x = 12 >>> type(x)3 <type 'int'>4 >>> x.__class__5 <type 'int'>
現在來看看int,str,dict這些類型的類型:1 <type 'int'>2 >>> type(int)3 <type 'type'>4 >>> type(str)5 <type 'type'>6 >>> type(dict)7 <type 'type'>8 >>> type(type)9 <type 'type'>從這個輸出來看,int,str,dict這些類型的類型都是type,這也印證了前面說的,所有類型都是通過元類type生成的。
B. Python中類定義的問題
A1:參數self代表實例本身,例如: A=FooClass(),那麼self就代表A,類函數中,self是必需的
A2:__class__獲得已知對象的類,任何對象都有這個屬性,__name__取得類名
A3:version是類成員變數,實例化後是實例變數,類函數獲得實例變數需要帶上實例本身,這個其實我也很難解釋得很透徹,可以大概講一下
version = 0.1 這里在實例化之前就已經生成了
而__init__(self,nm='Louis wu'):這里的nm變數是在實例化的時候生成的
在類方法中訪問version和nm的方式是一樣的,self.version和self.nm
但是version在類沒有實例化的情況下也是可以訪問的,因為它在實例化之前就已經聲明了
你可以嘗試
print FooClass.version 是可以得到version的值的
但是FooClass.nm是不可以的,必須是實例化之後才生成這個變數,FooClass().nm就可以訪問到了
C. python四種基本數據類型
python是相當高級的語言,基本數據類型就很多,不過參考其他語言的,一定要四個的話:
1、整形 int
定義:age=10 #age=int(10)
用於標識:年齡,等級,身份證號,qq號,個數
2、浮點型 float
定義:salary=3.1 #salary=float(3.1)
用於標識:工資,身高,體重
3、字元竄 string
#在python中,加了引號的字元就是字元串類型,python並沒有字元類型。
定義:name='egon' #name=str('egon')
用於標識:描述性的內容,如姓名,性別,國籍,種族
4、布爾 bool
D. python 類定義
self,作用是綁定,表示對類的實例化對象的綁定。比如實例化你這的Node類,n=Node(),如果方法traverse括弧內不加self,當n.traverse()在Python執行則會變成n=traverse(n),然後就會報錯。所以在Python里必須加self綁定。
你也可以用其他的,比如其他語言里用this,但都得有這么個參數來佔位作為綁定。
[],表示列表的特徵符。
那麼這里的[self]即是讓實例化對象n經過traverse得到的結果或者表達式後再將其轉為列表。
比如整形數1,2。當我們用中括弧把其包圍,[1,2],那麼其就成了列表。就這么回事。
還可以這樣:int(self),tuple(self)等的。
其實很簡單,別看到self就被唬住了。
我建議還是多看看面相對象編程那一快
E. python定義數據類型
python定義數據的時候,不指定具體類型,你指定哪個類型的數據給變數,這個變數在指定後就是哪種數據,非常靈活;這點不像其他編程軟體,比如C,C++,java.
比如:
a = 10
b =10.0
c="I love python"
d = True
e = 1+2j
print(a)
type(a)
print(b)
type(b)
print(c)
type(c)
print(d)
type(d)
print(e)
type(e)
****************
以下是執行結果
>>> a = 10
>>>
>>> b =10.0
>>>
>>> c="I love python"
>>>
>>> d = True
>>>
>>> e = 1+2j
>>>
>>> print(a)
10
>>>
>>> type(a)
<class 'int'>
>>>
>>> print(b)
10.0
>>>
>>> type(b)
<class 'float'>
>>>
>>> print(c)
I love python
>>>
>>> type(c)
<class 'str'>
>>>
>>> print(d)
True
>>>
>>> type(d)
<class 'bool'>
>>>
>>> print(e)
(1+2j)
>>>
>>> type(e)
<class 'complex'>
>>>
---------------
代碼說明:
<class 'int'> 說明a是整型變數
<class 'float'> 說明b是浮點類型,也就是我們數學上說的帶有小數點的數
<class 'str'> 說明c是字元串類型的數據
<class 'Boolen') 說明d是布爾類型的數據
<class 'complex') 說明e是復數類型的數據
F. python中如何定義int類型
標准數據類型
Python3 中有六個標準的數據類型:
Number(數字)
String(字元串)
List(列表)
Tuple(元組)
Set(集合)
Dictionary(字典)
Python3 的六個標准數據類型中:
不可變數據(3 個):Number(數字)、String(字元串)、Tuple(元組);
可變數據(3 個):List(列表)、Dictionary(字典)、Set(集合)。
Python int有多種數字類型:整型int、長整型、布爾型bool、浮點數float、復數complex,先期在基礎python學習過程中只要了解整型
和布爾型就可以了。
整型int的創建、聲明
創建一個新整型變數和給變數賦值是相同的過程
a = 123 或 b = -123 等號左邊是變數名,右邊是要賦的值,就是這么簡單。
整型的特點
既然是整型自然賦值時候的數據要是整數才行,整數簡單理解為(正整數和負整數)。
Python學習網,大量免費的學習資源,歡迎學習!
G. python類的定義與使用是什麼
類Class:用來描述具體相同的屬性和方法的對象的集合。定義了該集合中每個對象所共有的屬性和方法。對象是類的示例。
類定義完成時(正常退出),就創建了一個 類對象。基本上它是對類定義創建的命名空間進行了一個包裝;我們在下一節進一步學習類對象的知識。原始的局部作用域(類定義引入之前生效的那個)得到恢復,類對象在這里綁定到類定義頭部的類名(例子中是 ClassName )。
基本語法
Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其他的靜態語言如C、Pascal那樣需要重復書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。
以上內容參考:網路-Python
H. python 類的定義
Python編程中類定義,代碼如下:
class<類名>:
<語句>
定義類的專有方法:
__init__構造函數,在生成對象時調用
__del__析構函數,釋放對象時使用
__repr__列印,轉換
__setitem__按照索引賦值
__getitem__按照索引獲取值
__len__獲得長度
__cmp__比較運算
__call__函數調用
__add__加運算
__sub__減運算
__mul__乘運算
__div__除運算
__mod__求余運算
__pow__稱方
代碼如下:
#類定義
classpeople:
#定義基本屬性
name=''
age=0
#定義私有屬性,私有屬性在類外部無法直接進行訪問
__weight=0
#定義構造方法
def__init__(self,n,a,w):
self.name=n
self.age=a
self.__weight=w
defspeak(self):
print("%sisspeaking:Iam%dyearsold"%(self.name,self.age))
p=people('tom',10,30)
p.speak()
I. Python有哪些種類
Python有哪些種類?
1、數值型(Numbers)
2、布爾型(Booleans)
3、字元串(String)
4、Python容器
要快速學會Python,謹記『3個』『4類』『5大』『6種』這四個數字就可以了。
三個基本概念
1. 結構化(函數、模塊、包)
2. 面向對象(類及派生類、重載)
3. 虛擬環境(版本管理、環境隔離)
四類基本操作
1. 數據操作(各種數據類型的操作)
2. 文件操作(文件打開讀寫關閉等操作)
3. 模塊操作(導入使用、模塊查尋等操作)
4.並發操作(進程與線程、鎖/信號號/安全隊列等)
五大基本語句(5)
1. 賦值語句(變數、對象、賦值運算符)
2. 輸入輸出語句(print, input函數)
3. 條件判斷語句(if-elif-else語句)
4. 循環語句(遍歷循環for-in-else、條件循環while-else、break/continue)
5. 異常處理語句(try-except-else-finally)
六種數據類型(6)
1. 數字類型(int,bool,float,complex)
2. 字元串(str)
3. 列表(list)
4. 元組(tuple)
5. 字典(dict)
6. 集合(set)
如果你能夠把上面的幾個要點都掌握了,那麼就算是真正地入門了。
J. Python中類的定義規是什麼
類的概念:
類 Class: 用來描述具體相同的屬性和方法的對象的集合。定義了該集合中每個對象所共有的屬性和方法。對象是類的示例。
類變數:類變數在整個實例化的對象中是公用的。類變數定義在類中且在函數體之外。類變數通常不作為實例變數使用。
實例變數:定義在方法中的變數,只作用於當前實例的類。
數據成員:類變數或者實例變數用於處理類及其實例對象的相關數據。
方法:類中定義的函數。在類內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self, 且為第一個參數,self 代表的是類的實例。
構造函數:即__init()__,特殊的方法,在對象創建的時候被自動調用。
析構函數:即__del()__,特殊的方法,在對象被銷毀時被自動調用。
實例化:創建一個類的實例,類的具體對象。就是將創建的類賦值給另一個變數。理解為賦值即可,a = class(),這個過程,就叫做實例化
對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變數和實例變數)和方法。
繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模擬」是一個(is-a)」關系(例圖,Dog是一個Animal)。
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其 進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
————————————————
原文鏈接:https://blog.csdn.net/f156207495/article/details/81166252
網頁鏈接