zoukankan      html  css  js  c++  java
  • 函数參数

    在以下这行语句里:

    MessageBox(None, 'Hello World!', 'Hello World', 0)

    括号中的就是函数的參数列表。

    C语言编写的函数时,定义函数的參数是使用C语言的方式来定义,那么在Python里编程是使用Python定义的类型。这两者之间是有区别的,这样的区别主要体如今类型定义内存的方式不一样。比方大小不一样,就算大小一样。在Python里还有每一个对象的引用计数。比方字符串在Python里是表示为一个对象,这个对象不但拥有字符串占用内存的空间,还有这个字符串引用的次数。而在C语言里仅仅是表示拥有字符串占用内存的空间,没有引用的次数。

    为了在Python里能把Python的类型定义的数据对象转换为C语言的格式,是须要通过ctypes定义的类型来实现转换。

    ctype里有几个Python的数据类型是默认转换的,比方None/int/bytes/string(unicode),默认的转换相应关系例如以下表:

    Python类型

    C类型

    None

    NULL

    int

    int

    bytes

    char*

    string

    char*

    unicode string

    wchar_t*

    所以在上面MessageBox函数调用中,直接写入这些參数,就能够了,不会有报错。假设是其他的数据类型,就须要使用ctype库的类型来定义了。比方C语言里结构定义的类型,这样的类型的相应关系,例如以下表:

    ctypes类型

    C语言类型

    Python类型

    c_bool

    _Bool

    bool(1)

    c_char

    char

    1个字节的bytes对象

    c_wchar

    wchar_t

    1个字节的字符串对象

    c_byte

    char

    int

    c_ubyte

    unsigned char

    int

    c_short

    short

    int

    c_ushort

    unsigned short

    int

    c_int

    int

    int

    c_uint

    unsigned int

    int

    c_long

    long

    int

    c_ulong

    unsigned long

    int

    c_longlong

    __int64 long long

    int

    c_ulonglong

    unsigned __int64unsigned long long

    int

    c_size_t

    size_t

    int

    c_ssize_t

    ssize_t Py_ssize_t

    int

    c_float

    float

    float

    c_double

    double

    float

    c_longdouble

    long double

    float

    c_char_p

    char*

    bytes对象或None

    c_wchar_p

    wchar_t

    字符串或None

    c_void_p

    void*

    int None

    通过上表的关系。就能够找到全部Python里与C语言里类型相关的描写叙述方式。这样就能够定义与之相相应的数据结构,然后把这些结构传递给函数,就能够实现相互交换数据。依据这些数据类型的定义,能够把前面的Hello World的样例改动例如以下:

    #开发者:蔡军生(QQ9073204) 深圳  2014-8-11

    from ctypes import *

    MessageBox = windll.user32.MessageBoxW

    handle = c_void_p(0)

    hello = c_wchar_p('Hello World!')

    title = c_wchar_p('Hello World')

    mb_flag = c_int(0)

    res = MessageBox(handle, hello, title, mb_flag)

    在这个样例里,第一个參数是父窗体的句柄,前面是使用None来表示,如今使用c_void_p(0)来表示;显示内容的字符串在前面是直接表示,如今使用c_wchar_p('Hello World!')类型来表示,这样是表示一个UNICODE字符串。最后一个參数是使用c_int(0)来表示给函数的标志,比方显示button方式、是否有图标显示等等。通过ctypes里提供的类型转换,就能够无缝地对接C语言标准的动态连接库。

  • 相关阅读:
    年度回忆录(2012.102013.01)
    Java中的Annotation(1)三个基本Annotation
    Java7中的文件和目录管理Path类
    Struts1和Struts2核心控制器的执行原理
    java中的IO基础3
    动态代理(2)动态代理和AOP
    java中的IO基础
    《嫌疑犯x的献身》看完了。。。
    像NHibernate致敬ado.net entity framework的范型DAO和open session in view实现
    我的MBTI职业性格测试
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6845434.html
Copyright © 2011-2022 走看看