在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 二、使用 <code>type()</code> 動態(tài)創(chuàng)建類
二、Enum 的源碼
前言
一、Python 模塊簡介
一、List(列表)
五、匿名函數(shù)
三、什么是元類
二、循環(huán)語句
二、模塊的使用
三、第一個 Python 程序
線程與進(jìn)程
Python
三、條件語句和循環(huán)語句綜合實(shí)例
四、對象的描述器
三、類的屬性
一、迭代
五、迭代器和生成器綜合例子
六、運(yùn)算符相關(guān)的魔術(shù)方法
一、枚舉類的使用
前言
一、簡明概述
二、Python 的基本數(shù)據(jù)類型
多線程編程
五、作用域
四、包
四、枚舉的比較
四、Python 中的變量
六、類的多態(tài)
一、Python 中類也是對象
一、Python 的 Magic Method
前言
四、生成器
一、面向?qū)ο蟮母拍?/span>
五、類的繼承
二、類
二、使用 <code>type()</code> 動態(tài)創(chuàng)建類
進(jìn)程
二、set
三、主模塊和非主模塊
一、字典(Dictionary)
前言
前言
前言
前言
四、集成開發(fā)環(huán)境(IDE): PyCharm
前言
四、函數(shù)的參數(shù)
三、lsit 生成式(列表生成式)
四、自定義元類
四、類的方法
二、函數(shù)傳值問題
二、注釋
一、條件語句
一、Python 語法的簡要說明
三、函數(shù)返回值
三、基本數(shù)據(jù)類型轉(zhuǎn)換
三、屬性的訪問控制
二、Python 的安裝
前言
三、命名規(guī)范
一、Python 自定義函數(shù)的基本步驟
三、自定義類型的枚舉
五、自定義容器(Container)
二、Python 迭代器
前言
二、tuple(元組)
一、Python 簡介
前言
前言
前言
二、構(gòu)造(<code>__new__</code>)和初始化(<code>__init__</code>)
前言

二、使用 <code>type()</code> 動態(tài)創(chuàng)建類

因?yàn)轭愐彩菍ο?,所以我們可以在程序運(yùn)行的時候創(chuàng)建類。Python 是動態(tài)語言。動態(tài)語言和靜態(tài)語言最大的不同,就是函數(shù)和類的定義,不是編譯時定義的,而是運(yùn)行時動態(tài)創(chuàng)建的。在之前,我們先了了解下 type() 函數(shù)。

首先我們新建一個 hello.py 的模塊,然后定義一個 Hello 的 class ,

class Hello(object):
    def hello(self, name='Py'):
        print('Hello,', name)

然后在另一個模塊中引用 hello 模塊,并輸出相應(yīng)的信息。其中 type() 函數(shù)的作用是可以查看一個類型和變量的類型。

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

from com.twowater.hello import Hello

h = Hello()
h.hello()

print(type(Hello))
print(type(h))

輸出的結(jié)果是怎樣的呢?

Hello, Py
<class 'type'>
<class 'com.twowater.hello.Hello'>

上面也提到過,type() 函數(shù)可以查看一個類型或變量的類型,Hello 是一個 class ,它的類型就是 type ,而 h 是一個實(shí)例,它的類型就是 com.twowater.hello.Hello。前面的 com.twowater 是我的包名,hello 模塊在該包名下。

在這里還要細(xì)想一下,上面的例子中,我們使用 type() 函數(shù)查看一個類型或者變量的類型。其中查看了一個 Hello class 的類型,打印的結(jié)果是: <class 'type'> 。其實(shí) type() 函數(shù)不僅可以返回一個對象的類型,也可以創(chuàng)建出新的類型。class 的定義是運(yùn)行時動態(tài)創(chuàng)建的,而創(chuàng)建 class 的方法就是使用 type() 函數(shù)。比如我們可以通過 type() 函數(shù)創(chuàng)建出上面例子中的 Hello 類,具體看下面的代碼:

# -*- coding: UTF-8 -*-

def printHello(self, name='Py'):
    # 定義一個打印 Hello 的函數(shù)
    print('Hello,', name)

# 創(chuàng)建一個 Hello 類
Hello = type('Hello', (object,), dict(hello=printHello))

# 實(shí)例化 Hello 類
h = Hello()
# 調(diào)用 Hello 類的方法
h.hello()
# 查看 Hello class 的類型
print(type(Hello))
# 查看實(shí)例 h 的類型
print(type(h))

輸出的結(jié)果如下:

Hello, Py
<class 'type'>
<class '__main__.Hello'>

在這里,需先了解下通過 type() 函數(shù)創(chuàng)建 class 對象的參數(shù)說明:

1、class 的名稱,比如例子中的起名為 Hello

2、繼承的父類集合,注意 Python 支持多重繼承,如果只有一個父類,tuple 要使用單元素寫法;例子中繼承 object 類,因?yàn)槭菃卧氐?tuple ,所以寫成 (object,)

3、class 的方法名稱與函數(shù)綁定;例子中將函數(shù) printHello 綁定在方法名 hello

具體的模式如下:

type(類名, 父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))

好了,了解完具體的參數(shù)使用之外,我們看看輸出的結(jié)果,可以看到,通過 type() 函數(shù)創(chuàng)建的類和直接寫 class 是完全一樣的,因?yàn)镻ython 解釋器遇到 class 定義時,僅僅是掃描一下 class 定義的語法,然后調(diào)用 type() 函數(shù)創(chuàng)建出 class 的 。

不過一般的情況下,我們都是使用 class ***... 的方法來定義類的,不過 type() 函數(shù)也可以讓我們創(chuàng)建出類來。也就是說,動態(tài)語言本身支持運(yùn)行期動態(tài)創(chuàng)建類,這和靜態(tài)語言有非常大的不同,要在靜態(tài)語言運(yùn)行期創(chuàng)建類,必須構(gòu)造源代碼字符串再調(diào)用編譯器,或者借助一些工具生成字節(jié)碼實(shí)現(xiàn),本質(zhì)上都是動態(tài)編譯,會非常復(fù)雜。

可以看到,在 Python 中,類也是對象,你可以動態(tài)的創(chuàng)建類。其實(shí)這也就是當(dāng)你使用關(guān)鍵字 class 時 Python 在幕后做的事情,而這就是通過元類來實(shí)現(xiàn)的。