欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

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

# 實(shí)例方法
def print_b(self):
  print(self.num)
# 靜態(tài)方法
@staticmethod
def print_static():
  print("----haha-----")
# 類(lèi)方法
@classmethod
def print_class(cls):
  print(cls.num)
# 用type創(chuàng)建類(lèi)
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

元類(lèi)的應(yīng)用

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

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

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

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

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

#-*- coding:utf-8 -*-
def upper_attr(class_name, class_parents, class_attr):
  # class_name 會(huì)保存類(lèi)的名字 Foo
  # class_parents 會(huì)保存類(lèi)的父類(lèi) object
  # class_attr 會(huì)以字典的方式保存所有的類(lèi)屬性/方法
  # 遍歷屬性字典,把不是__開(kāi)頭的屬性名字變?yōu)榇髮?xiě)
  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è)類(lèi)
  return type(class_name, class_parents, new_attr)
class Foo(object, metaclass=upper_attr): # python3的方式
  # python2.x的方式。
  # __metaclass__ = upper_attr # 設(shè)置Foo類(lèi)的元類(lèi)為upper_attr
  bar = 'bip'
print(hasattr(Foo, 'bar'))
print(hasattr(Foo, 'BAR'))
f = Foo()
print(f.BAR)

demo.py(用類(lèi)指定__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ì)象是類(lèi),我們希望能夠自定義它,所以我們這里改寫(xiě)__new__
  # 如果你希望的話,你也可以在__init__中做些事情
  # 還有一些高級(jí)的用法會(huì)涉及到改寫(xiě)__call__特殊方法,但是我們這里不用
  def __new__(cls, class_name, class_parents, class_attr):
    # 遍歷屬性字典,把不是__開(kāi)頭的屬性名字變?yōu)榇髮?xiě)
    new_attr = {}
    for name, value in class_attr.items():
      if not name.startswith("__"):
        new_attr[name.upper()] = value
    # 方法1:通過(guò)'type'來(lái)做類(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)容感興趣的讀者可查看本站專(zhuān)題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程

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

相關(guān)文章

  • Python中緩存lru_cache的基本介紹和講解

    Python中緩存lru_cache的基本介紹和講解

    緩存是一種將定量數(shù)據(jù)加以保存以備迎合后續(xù)請(qǐng)求的處理方式,旨在加快數(shù)據(jù)的檢索速度,下面這篇文章主要給大家介紹了關(guān)于Python中緩存lru_cache的基本介紹和講解的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Python 實(shí)現(xiàn)子類(lèi)獲取父類(lèi)的類(lèi)成員方法

    Python 實(shí)現(xiàn)子類(lèi)獲取父類(lèi)的類(lèi)成員方法

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)子類(lèi)獲取父類(lèi)的類(lèi)成員方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • PyQt5 實(shí)現(xiàn)字體大小自適應(yīng)分辨率的方法

    PyQt5 實(shí)現(xiàn)字體大小自適應(yīng)分辨率的方法

    今天小編就為大家分享一篇PyQt5 實(shí)現(xiàn)字體大小自適應(yīng)分辨率的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python中__init__方法知識(shí)點(diǎn)詳解

    python中__init__方法知識(shí)點(diǎn)詳解

    Python中常會(huì)看到在很多類(lèi)中都有一個(gè)__init__函數(shù),該函數(shù)有什么作用,又該如何使用呢,下面這篇文章主要給大家介紹了關(guān)于python中__init__知識(shí)點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 如何用Python實(shí)現(xiàn)八數(shù)碼問(wèn)題

    如何用Python實(shí)現(xiàn)八數(shù)碼問(wèn)題

    這篇文章主要給大家介紹了關(guān)于如何用Python實(shí)現(xiàn)八數(shù)碼問(wèn)題的相關(guān)資料,八數(shù)碼問(wèn)題是一種經(jīng)典的搜索問(wèn)題,它的目標(biāo)是將一個(gè)亂序的八數(shù)碼序列變成一個(gè)有序的八數(shù)碼序列,通常使用 A* 算法來(lái)解決,需要的朋友可以參考下
    2023-10-10
  • python如何使用Redis構(gòu)建分布式鎖

    python如何使用Redis構(gòu)建分布式鎖

    這篇文章主要介紹了python如何使用Redis構(gòu)建分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python使用遞歸解決全排列數(shù)字示例

    python使用遞歸解決全排列數(shù)字示例

    有1,2,3,4這4個(gè)數(shù)字,能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的三位數(shù),下面是二種解決示例,需要的朋友可以參考下
    2014-02-02
  • 使用Python的Scrapy框架十分鐘爬取美女圖

    使用Python的Scrapy框架十分鐘爬取美女圖

    Scrapy是一個(gè)使用Python編寫(xiě)的,輕量級(jí)的,簡(jiǎn)單輕巧,并且使用起來(lái)非常的方便。使用Scrapy可以很方便的完成網(wǎng)上數(shù)據(jù)的采集工作,它為我們完成了大量的工作,而不需要自己費(fèi)大力氣去開(kāi)發(fā)。本文介紹了使用Python的Scrapy框架十分鐘爬取美女圖,需要的朋友可以參考下
    2016-12-12
  • python使用建議技巧分享(三)

    python使用建議技巧分享(三)

    這篇文章主要介紹了python的一些使用建議技巧分享,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-08-08
  • Django框架ORM數(shù)據(jù)庫(kù)操作實(shí)例詳解

    Django框架ORM數(shù)據(jù)庫(kù)操作實(shí)例詳解

    這篇文章主要介紹了Django框架ORM數(shù)據(jù)庫(kù)操作,結(jié)合實(shí)例形式詳細(xì)分析了Django框架ORM數(shù)據(jù)庫(kù)基本增刪改查與相關(guān)函數(shù)使用技巧,需要的朋友可以參考下
    2019-11-11

最新評(píng)論