中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Python中使用元類type創建類對象

發布時間:2021-03-23 16:13:43 來源:億速云 閱讀:161 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關如何在Python中使用元類type創建類對象,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

具體如下:

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

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

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

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

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

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

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

# 實例方法
def print_b(self):
  print(self.num)
# 靜態方法
@staticmethod
def print_static():
  print("----haha-----")
# 類方法
@classmethod
def print_class(cls):
  print(cls.num)
# 用type創建類
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__屬性(指定創建該類的元類),默認使用type元類創建類對象。

通過指定自定義的元類,可以對類的創建進行攔截。可以對類名、繼承的父類、屬性(方法)做一些預處理。

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

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

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

#-*- coding:utf-8 -*-
def upper_attr(class_name, class_parents, class_attr):
  # class_name 會保存類的名字 Foo
  # class_parents 會保存類的父類 object
  # class_attr 會以字典的方式保存所有的類屬性/方法
  # 遍歷屬性字典,把不是__開頭的屬性名字變為大寫
  new_attr = {}
  for name, value in class_attr.items():
    if not name.startswith("__"):
      new_attr[name.upper()] = value
  # 調用type來創建一個類
  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__是用來創建對象并返回之的方法
  # 而__init__只是用來將傳入的參數初始化給對象
  # 你很少用到__new__,除非你希望能夠控制對象的創建
  # 這里,創建的對象是類,我們希望能夠自定義它,所以我們這里改寫__new__
  # 如果你希望的話,你也可以在__init__中做些事情
  # 還有一些高級的用法會涉及到改寫__call__特殊方法,但是我們這里不用
  def __new__(cls, class_name, class_parents, class_attr):
    # 遍歷屬性字典,把不是__開頭的屬性名字變為大寫
    new_attr = {}
    for name, value in class_attr.items():
      if not name.startswith("__"):
        new_attr[name.upper()] = value
    # 方法1:通過'type'來做類對象的創建
    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中使用元類type創建類對象就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河津市| 西藏| 巴南区| 韶关市| 菏泽市| 绩溪县| 贺兰县| 海安县| 惠来县| 紫云| 偃师市| 宜章县| 赫章县| 通道| 谢通门县| 分宜县| 全椒县| 虎林市| 德兴市| 常山县| 宁安市| 泽普县| 泸定县| 英山县| 云霄县| 三江| 恩施市| 台湾省| 宁远县| 罗城| 郓城县| 方正县| 兰州市| 天门市| 平顺县| 孝感市| 永仁县| 木兰县| 姜堰市| 宁化县| 濮阳市|