元类及创建元类的方法(面试用
生活随笔
收集整理的這篇文章主要介紹了
元类及创建元类的方法(面试用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
元類就是類的類,type就是Python中創建所有類的元類。type就是創建類對象的類。Python中所有的東西——都是對象。這包括整數、字符串、函數以及類。它們全部都是對象,并且它們都是從一個類創建來,這個類就是type。
# class Foo(object):
#???? a = 100
# # 對于上面聲明類的代碼,實際上是由type幫助我們創建了類,具體可以理解為下面的過程
#
# # type(類名, 基類/父類元祖, 方法與類屬性 字典)? ——> 返回創建出來的類
# # Foo = type("Foo", (object,), {"a": 100})
#
# obj = Foo()
?
######################
# 使用type創建類
?
# 對象方法
def obj_fun(self):
??? print("obj_fun")
?
# 類方法
@classmethod
def class_fun(cls):
??? print("class_fun called")
?
# 靜態方法
@staticmethod
def static_fun():
??? print("static fun called")
?
# 通過type創建一個類,然后找了一個變量bar來接收
bar = type("Foo", (object,), {"a": 100, "o_fun": obj_fun, "c_fun": class_fun, "s_fun": static_fun})
?
# print(bar.__name__)
obj = bar()
obj.o_fun()
?
# print(type(obj))
#
# print(bar.a)
bar.c_fun()
bar.s_fun()
?
?
# 用函數的語法自己定義了一個元類? upper_meta_class
def upper_meta_class(class_name, class_bases, class_attrs):
??? """自己定義的元類"""
?? ?# class_name 用來接收類名? 字符串
??? # class_bases 用來接收基類? 元祖
??? # class_attrs 用來接收屬性? 字典? {"a":100, "b": 200}
?
??? new_class_attrs = {}
?? ?# 通過循環遍歷class_attrs, 調整里面的鍵值對,放到new_class_attrs
??? for key, value in class_attrs.items():
??????? new_class_attrs[key.upper()] = value
?
??? # new_class_attrs = {"A": 100, "B": 200}
?
??? return type(class_name, class_bases, new_class_attrs)
?
?
# 使用元類的方法
class Foo(object, metaclass=upper_meta_class):
??? a = 100
??? b = 200
?
?
# Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200})
?
# print(Foo.a)
print(Foo.A)
?
?
?
class upper_meta_class(type):
??? """自定義元類"""
??? def __new__(cls, class_name, class_bases, class_attrs):
??????? """決定了對象的真實構造過程,對象是由new方法創造出來的"""
?
??????? new_class_attrs = {}
??????? # 通過循環遍歷class_attrs, 調整里面的鍵值對,放到new_class_attrs
??????? for key, value in class_attrs.items():
??????????? new_class_attrs[key.upper()] = value
?
??????? # new_class_attrs = {"A": 100, "B": 200}
?
??????? # return type(class_name, class_bases, new_class_attrs)
?
?? ?????# 子類中調用父類的三種方法:
?????? ?#1. return type.__new__(cls, class_name, class_bases, new_class_attrs)
????? ??#2. return super().__new__(cls, class_name, class_bases, new_class_attrs)
???? ??3. return super(upper_meta_class, cls).__new__(cls, class_name, class_bases, new_class_attrs)
?
?
??? # def __init__(self, class_name, class_bases, class_attrs):
??? #???? """初始化方法,對象已經存在,只是為對象進行屬性設置"""
?
# python3 使用元類的方法
class Foo(object, metaclass=upper_meta_class):
??? a = 100
??? b = 200
#
# # python2 使用元類的方法
# class Foo(object):
#???? ___metaclass__ = upper_meta_class
#???? a = 100
#???? b = 200
?
?
# Foo = upper_meta_class("Foo", (object,), {"a":100, "b": 200})
?
# print(Foo.a)
print(Foo.A)
?
就是這樣,除此之外,關于元類真的沒有別的可說的了。但就元類本身,它們其實是很簡單的:
攔截類的創建 修改類 返回修改之后的類究竟為什么要使用元類?
“元類就是深度的魔法,99%用戶根本不必為此操?。如果你想搞清楚究竟是否需要用到元類,那么你就不需要它。??? ——Python界的領袖??? Tim??? Peters
總結
以上是生活随笔為你收集整理的元类及创建元类的方法(面试用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flask简介与简单项目操作流程
- 下一篇: 多进程修改全局变量