最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 使用元類type創(chuàng)建類對(duì)象常見(jiàn)應(yīng)用詳解

 更新時(shí)間:2019年10月17日 09:22:44   作者:houyanhua1  
這篇文章主要介紹了Python 使用元類type創(chuàng)建類對(duì)象,結(jié)合實(shí)例形式詳細(xì)分析了Python元類的概念、功能及元類type創(chuàng)建類對(duì)象的常見(jiàn)應(yīng)用技巧,需要的朋友可以參考下

本文實(shí)例講述了Python 使用元類type創(chuàng)建類對(duì)象。分享給大家供大家參考,具體如下:

type("123") 可以查看變量的類型;同時(shí) type("類名",(父類),{類屬性:值,類屬性2:值}) 可以創(chuàng)建一個(gè)類。

在Python中不建議一個(gè)函數(shù)具有不同的功能(重載);type()具有不同的功能是為了兼容之前的版本。

類可以創(chuàng)建實(shí)例對(duì)象,類對(duì)象是由元類創(chuàng)建的。 (元類創(chuàng)建類,類創(chuàng)建實(shí)例對(duì)象)

type就是元類(type本質(zhì)上就是一個(gè)類)

demo.py(用元類type創(chuàng)建類):

# 通過(guò)class關(guān)鍵字創(chuàng)建類
class MyClass1(object):
  name = "張三" # 類屬性 (所有實(shí)例對(duì)象共用)
  age = 23
# 通過(guò)type創(chuàng)建類。 type()返回的是創(chuàng)建的類對(duì)象的引用。
Test2 = type("MyClass2",(object,),{"name":"張三","age":23}) # Test2是MyClass2類的引用,一般變量名和類名保持一致。
print(Test2()) # <__main__.MyClass2 object at 0x7fa05a4ca9e8>

demo.py(用type創(chuàng)建帶有方法的類):

# 實(shí)例方法
def print_b(self):
  print(self.num)
# 靜態(tài)方法
@staticmethod
def print_static():
  print("----haha-----")
# 類方法
@classmethod
def print_class(cls):
  print(cls.num)
# 用type創(chuàng)建類
B = type("B", (object,), {"num":100, "print_b": print_b, "print_static": print_static, "print_class": print_class})
b = B()
b.print_b()   # 100
b.print_static() # ----haha-----
b.print_class()  # 100

元類的應(yīng)用

在定義一個(gè)類的時(shí)候可以為其指定__metaclass__屬性(指定創(chuàng)建該類的元類),默認(rèn)使用type元類創(chuàng)建類對(duì)象。

通過(guò)指定自定義的元類,可以對(duì)類的創(chuàng)建進(jìn)行攔截??梢詫?duì)類名、繼承的父類、屬性(方法)做一些預(yù)處理。

例如:將類名大寫,默認(rèn)繼承object類,添加、修改屬性(方法)名(私有屬性的偽私有化就是通過(guò)修改屬性名實(shí)現(xiàn)的)。

裝飾器是對(duì)函數(shù)進(jìn)行功能擴(kuò)展(不用修改原代碼),而元類可以對(duì)類進(jìn)行功能擴(kuò)展(添加額外的屬性/方法)。

demo.py(用函數(shù)指定__metaclass__屬性):

#-*- coding:utf-8 -*-
def upper_attr(class_name, class_parents, class_attr):
  # class_name 會(huì)保存類的名字 Foo
  # class_parents 會(huì)保存類的父類 object
  # class_attr 會(huì)以字典的方式保存所有的類屬性/方法
  # 遍歷屬性字典,把不是__開(kāi)頭的屬性名字變?yōu)榇髮?
  new_attr = {}
  for name, value in class_attr.items():
    if not name.startswith("__"):
      new_attr[name.upper()] = value
  # 調(diào)用type來(lái)創(chuàng)建一個(gè)類
  return type(class_name, class_parents, new_attr)
class Foo(object, metaclass=upper_attr): # python3的方式
  # python2.x的方式。
  # __metaclass__ = upper_attr # 設(shè)置Foo類的元類為upper_attr
  bar = 'bip'
print(hasattr(Foo, 'bar'))
print(hasattr(Foo, 'BAR'))
f = Foo()
print(f.BAR)

demo.py(用類指定__metaclass__屬性):

class UpperAttrMetaClass(type):
  # __new__ 是在__init__之前被調(diào)用的特殊方法
  # __new__是用來(lái)創(chuàng)建對(duì)象并返回之的方法
  # 而__init__只是用來(lái)將傳入的參數(shù)初始化給對(duì)象
  # 你很少用到__new__,除非你希望能夠控制對(duì)象的創(chuàng)建
  # 這里,創(chuàng)建的對(duì)象是類,我們希望能夠自定義它,所以我們這里改寫__new__
  # 如果你希望的話,你也可以在__init__中做些事情
  # 還有一些高級(jí)的用法會(huì)涉及到改寫__call__特殊方法,但是我們這里不用
  def __new__(cls, class_name, class_parents, class_attr):
    # 遍歷屬性字典,把不是__開(kāi)頭的屬性名字變?yōu)榇髮?
    new_attr = {}
    for name, value in class_attr.items():
      if not name.startswith("__"):
        new_attr[name.upper()] = value
    # 方法1:通過(guò)'type'來(lái)做類對(duì)象的創(chuàng)建
    return type(class_name, class_parents, new_attr)
    # 方法2:復(fù)用type.__new__方法
    # 這就是基本的OOP編程,沒(méi)什么魔法
    # return type.__new__(cls, class_name, class_parents, new_attr)
# python3的用法
class Foo(object, metaclass=UpperAttrMetaClass):
  bar = 'bip'
# python2的用法
# class Foo(object):
#   __metaclass__ = UpperAttrMetaClass
#   bar = 'bip'
print(hasattr(Foo, 'bar'))
# 輸出: False
print(hasattr(Foo, 'BAR'))
# 輸出:True
f = Foo()
print(f.BAR)
# 輸出:'bip'

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Django xadmin安裝及使用詳解

    Django xadmin安裝及使用詳解

    這篇文章主要介紹了Django xadmin安裝及使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 如何在Cloud Studio上執(zhí)行Python代碼?

    如何在Cloud Studio上執(zhí)行Python代碼?

    這篇文章主要介紹了如何在Cloud Studio上執(zhí)行Python代碼?,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python爬蟲(chóng)scrapy框架的梨視頻案例解析

    python爬蟲(chóng)scrapy框架的梨視頻案例解析

    這篇文章主要介紹了python爬蟲(chóng)scrapy框架的梨視頻案例解析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 基于Python編寫一個(gè)解析器

    基于Python編寫一個(gè)解析器

    這篇文章主要給大家介紹了如何基于Python編寫一個(gè)解析器,文章通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-08-08
  • PyCharm出現(xiàn)卡頓問(wèn)題的解決

    PyCharm出現(xiàn)卡頓問(wèn)題的解決

    這篇文章主要介紹了PyCharm出現(xiàn)卡頓問(wèn)題的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 基于python 開(kāi)立方的注意事項(xiàng)說(shuō)明

    基于python 開(kāi)立方的注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了基于python 開(kāi)立方的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • 基于python3監(jiān)控服務(wù)器狀態(tài)進(jìn)行郵件報(bào)警

    基于python3監(jiān)控服務(wù)器狀態(tài)進(jìn)行郵件報(bào)警

    這篇文章主要介紹了基于python3監(jiān)控服務(wù)器狀態(tài)進(jìn)行郵件報(bào)警,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Win10環(huán)境中如何實(shí)現(xiàn)python2和python3并存

    Win10環(huán)境中如何實(shí)現(xiàn)python2和python3并存

    這篇文章主要介紹了Win10環(huán)境中如何實(shí)現(xiàn)python2和python3并存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 如何基于Python獲取圖片的物理尺寸

    如何基于Python獲取圖片的物理尺寸

    這篇文章主要介紹了如何基于Python獲取圖片的物理尺寸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Pycharm中SQL語(yǔ)句提示SQL Dialect is Not Configured的解決

    Pycharm中SQL語(yǔ)句提示SQL Dialect is Not Config

    這篇文章主要介紹了Pycharm中SQL語(yǔ)句提示SQL Dialect is Not Configured的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-07-07

最新評(píng)論

汕尾市| 颍上县| 时尚| 丹凤县| 西乌珠穆沁旗| 平山县| 清丰县| 长乐市| 昆明市| 大姚县| 台湾省| 霞浦县| 津市市| 贺州市| 宁武县| 凤城市| 商河县| 衡南县| 密山市| 高陵县| 邻水| 肇源县| 永兴县| 鄢陵县| 安西县| 沐川县| 化隆| 隆林| 岱山县| 修水县| 卓资县| 和平区| 自治县| 左贡县| 宣恩县| 余庆县| 天津市| 兴隆县| 武冈市| 靖远县| 扶沟县|