日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义元类控制类的实例化行为

發布時間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义元类控制类的实例化行为 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#只是儲備 __call__方法:
# class Foo:
# def __call__(self, *args, **kwargs):
# print(self)
# print(args)
# print(kwargs)
# obj = Foo()
# obj(1, 2, 3, a = 5, g = 8)
'''
在python中一切都是對象, 此地,Foo也是對象,Foo可以加括號調用,所以 obj也可以加括號調用但是obj這個對象的類的內部必須有__call__方法,此地可以引出, Foo的元類內部也有__call__方法
'''
#Foo(1,2,3,a = 5, g = 8)就等于 Foo.__call__(Foo, 1,2,3,a = 5, g = 8) 激活type的__call__方法







class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
# if not class_name.istitle():
# raise TypeError('首字母必須大寫')
# if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
# raise TypeError('必須寫注釋且不能為空!')
# print(class_name)
# print(class_bases)
# print(class_dic)
super(Mymeta, self).__init__(class_name, class_bases, class_dic)
#print(self)
def __call__(self, *args, **kwargs): #obj = Chinese('egon', age = 25)
# print(self) #Chinese = self
# print(args) #args = 'egon'
# print(kwargs) #kwargs = 18
#第一件事:造一個空對象 obj
obj = object.__new__(self)
#第二件事:初始化 就是 __init__
self.__init__(obj, *args, **kwargs)
#第三件事:返回 對象 obj
return obj


class Chinese(object, metaclass=Mymeta):
country = 'china'
def __init__(self, name, age):
self.name = name
self.age = age
def talk(self):
print('老王的媳婦出軌啦!')
obj = Chinese('egon', 25) #相當于 Chinese.__call__(chinese, 'egon', 25)
'''
Chinese('egon', 25) 等同于 Chinese.__call__('egon', 25) 觸發__call__方法,然后創建一個空對象,然后實例化就是 __init__,最后把對象返回給調用者,就是自己定義的那個類的對象
'''


#print(obj.__dict__)

轉載于:https://www.cnblogs.com/yuexijun/p/10324938.html

總結

以上是生活随笔為你收集整理的自定义元类控制类的实例化行为的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。