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

Python 使用元類type創(chuàng)建類對象常見應用詳解

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

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

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

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

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

type就是元類(type本質上就是一個類)

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

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

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

# 實例方法
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

元類的應用

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

通過指定自定義的元類,可以對類的創(chuàng)建進行攔截??梢詫︻惷⒗^承的父類、屬性(方法)做一些預處理。

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

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

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

#-*- coding:utf-8 -*-
def upper_attr(class_name, class_parents, class_attr):
  # class_name 會保存類的名字 Foo
  # class_parents 會保存類的父類 object
  # class_attr 會以字典的方式保存所有的類屬性/方法
  # 遍歷屬性字典,把不是__開頭的屬性名字變?yōu)榇髮?
  new_attr = {}
  for name, value in class_attr.items():
    if not name.startswith("__"):
      new_attr[name.upper()] = value
  # 調用type來創(chuàng)建一個類
  return type(class_name, class_parents, new_attr)
class Foo(object, metaclass=upper_attr): # python3的方式
  # python2.x的方式。
  # __metaclass__ = upper_attr # 設置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__之前被調用的特殊方法
  # __new__是用來創(chuàng)建對象并返回之的方法
  # 而__init__只是用來將傳入的參數初始化給對象
  # 你很少用到__new__,除非你希望能夠控制對象的創(chuàng)建
  # 這里,創(chuàng)建的對象是類,我們希望能夠自定義它,所以我們這里改寫__new__
  # 如果你希望的話,你也可以在__init__中做些事情
  # 還有一些高級的用法會涉及到改寫__call__特殊方法,但是我們這里不用
  def __new__(cls, class_name, class_parents, class_attr):
    # 遍歷屬性字典,把不是__開頭的屬性名字變?yōu)榇髮?
    new_attr = {}
    for name, value in class_attr.items():
      if not name.startswith("__"):
        new_attr[name.upper()] = value
    # 方法1:通過'type'來做類對象的創(chuàng)建
    return type(class_name, class_parents, new_attr)
    # 方法2:復用type.__new__方法
    # 這就是基本的OOP編程,沒什么魔法
    # 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'

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python面向對象程序設計入門與進階教程》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程

希望本文所述對大家Python程序設計有所幫助。

相關文章

  • Django xadmin安裝及使用詳解

    Django xadmin安裝及使用詳解

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

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

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

    python爬蟲scrapy框架的梨視頻案例解析

    這篇文章主要介紹了python爬蟲scrapy框架的梨視頻案例解析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 基于Python編寫一個解析器

    基于Python編寫一個解析器

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

    PyCharm出現卡頓問題的解決

    這篇文章主要介紹了PyCharm出現卡頓問題的解決方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 基于python 開立方的注意事項說明

    基于python 開立方的注意事項說明

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

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

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

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

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

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

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

    Pycharm中SQL語句提示SQL Dialect is Not Config

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

最新評論

青川县| 湖北省| 临沭县| 河源市| 芦溪县| 阿拉善右旗| 孝感市| 儋州市| 陆丰市| 锡林郭勒盟| 读书| 南川市| 平顶山市| 浮梁县| 新平| 望城县| 明星| 内黄县| 彭阳县| 大庆市| 江安县| 牡丹江市| 塘沽区| 孝昌县| 工布江达县| 江永县| 皋兰县| 平果县| 扎囊县| 晋城| 太湖县| 龙陵县| 庄河市| 鸡东县| 利辛县| 华安县| 喀什市| 镇雄县| 芦山县| 县级市| 富蕴县|