網(wǎng)站首頁 編程語言 正文
類的定義
對象是通過類創(chuàng)建的,如下面的代碼:
# object 為頂層基類
class Work(object):
a = 100
Mywork = Work() # 實例化
print(Mywork ) # Mywork 是 Work 所創(chuàng)建的一個對象 <__main__.Work object at 0x101eb4630>
print(type(Mywork)) # <class '__main__.Work'>
print(type(Work)) # 類型為元類 <class 'type'>
解析:
可以看見對象 Mywork 是類 Work 創(chuàng)建的實例。然但是可以看到Work的類型時由一個叫 type 的類創(chuàng)建的實例。即 Mywork —》 Work —》 type 創(chuàng)建
上面的例子中對象是動態(tài)創(chuàng)建的,類則是通過關鍵字 class 聲明定義的
那么class關鍵字背后的玄機是什么呢?
- 實際上,class Work(object) 這樣的代碼,等價于 Work = type(‘Work’, (objects, ), {“a”:100})
- 即類 type 通過實例化創(chuàng)建了它的對象 Work,而這個 Work 恰恰是一個類,這樣能創(chuàng)建類的類,就是 Python 的元類。而在python中內(nèi)置的元類叫:type
一、什么是元類
- 用來創(chuàng)建類的類,叫做元類
- 類是元類創(chuàng)建出來的對象
- 函數(shù)type實際上是一個元類,type就是Python在背后用來創(chuàng)建所有類的元類
二、注意區(qū)分元類和繼承的基類
- type是元類,所有的類都是通過type所創(chuàng)建出來的
- object頂層的基類,所有類的繼承頂層父類都是object
三、type 元類的使用
可以看到type是小寫,一般情況下都會認為它是一個函數(shù),通過查看源代碼去看下如下定義的:
class type(object):
"""
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
"""
# 實例化
def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
"""
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
# (copied from class doc)
"""
pass
# 創(chuàng)建類
@staticmethod # known case of __new__
def __new__(*args, **kwargs): # real signature unknown
"""
Create and return a new object. See help(type) for accurate signature.
(創(chuàng)建并返回一個新對象)
"""
pass
type的用法一:獲取數(shù)據(jù)時那種類型 : type(object) -> the object’s type
a = 100
b = "100"
c = [11,22,33]
print(type(a)) # ======》 <class 'int'>
print(type(b)) # ======》 <class 'str'>
print(type(c)) # ======》 <class 'list'>
type的用法二:創(chuàng)建類:type(object_or_name, bases, dict)
1.在查看源碼的時候,可以看到在初始化時,init__方法接受三個參數(shù),type 在實例化的過程,也會重新創(chuàng)建一個新的類,而創(chuàng)建類的代碼來自__new 方法,它的參數(shù)與 __init__方法是一樣的。
2.當調(diào)用 type 進行實例化的時候,會先自動調(diào)用 new 方法,再調(diào)用__init__方法,最終會實例化一個對象,這個對象是一個類。
1. 元類 type 的 init 方法有3個參數(shù):
?1.name:類名(字符串類型)
?2.bases:繼承的父類(元祖類型)
?3.dict:屬性和方法組成的字典(字典類型)
具體例子:
# 通過 class 定義類
class Myclass(object):
a = 100
b = 200
# 通過type創(chuàng)建的類(動態(tài)創(chuàng)建類)
Myclass1 = type("Myclass1",(object,),{"a":"100","b":"200"})
print(Myclass)
print(Myclass1)
如果需要定義實例方法和類屬性怎么辦呢?,將方法和屬性以字典的形式傳進去
def work(self):
print("這是實例方法——————work————————")
# 定義類屬性值
def init_method(self, aa, bb, cc):
self.aa = aa
self.bb = bb
self.cc = cc
# 通過type創(chuàng)建的類(動態(tài)創(chuàng)建類)
Myclass2 = type("Myclass2",(object,),{"a":"100","b":"200","work":work,"work_1":work_1,"__init__":init_method})
m = Myclass2(11,22,33)
m.work()
print(m.aa, m.bb, m.cc)
四、自定義元類的使用
既然元類可以創(chuàng)建類,那也可以自定義元類,自定義直接繼承類 type ,在自定義元類的步驟:
1.定義一個類繼承type
2.重寫new方法
具體例子:
# 定義一個類繼承type
class Mytest(type):
# 重寫new方法
def __new__(cls, type_name, bases, atter, *args, **kwargs):
new_cls = super().__new__(cls,type_name, bases, atter)
return new_cls # 返回新的類
M2 = Mytest("M2",(Mytest,),{"atter":100})
print(M2) # =====》 <class '__main__.M2'>
使用class創(chuàng)建類的時候指定自定義的元類
1.不去指定時,默認創(chuàng)建都是type類
2.指定自定義的元類去創(chuàng)建類:metaclass = 指定的元類
class Myclass(type):
"""自定義的元類"""
def __new__(cls, type_name, bases, attrs, *args, **kwargs):
new_cls = super().__new__(cls, type_name, bases, attrs)
print("這個是Myclass:", type_name, bases, attrs, )
return new_cls
# 通過metaclass=xxxx 繼承自定義元類
class Inherited_class(metaclass=Myclass):
a = 100
b = 200
print(type(Inherited_class)) # ======》 <class '__main__.Myclass'>
原文鏈接:https://blog.csdn.net/qq_40236497/article/details/125422104
相關推薦
- 2024-03-22 【IDEA】解決配置xml文件時,idea提示 application context not co
- 2022-06-12 Python中常用的內(nèi)置函數(shù)_python
- 2023-10-14 SQL Server 執(zhí)行sql報錯'sys.sp_OACreate' 的訪問
- 2023-07-18 Springboot獲取jar包同級目錄
- 2022-09-30 centos7安裝docker容器的超詳細步驟記錄_docker
- 2022-09-30 關于react中useCallback的用法_React
- 2022-10-07 Android?Gradle?三方依賴管理詳解_Android
- 2022-07-31 Python常見的幾種數(shù)據(jù)加密方式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支